Установите ширину в соответствии с ограничениями в ConstraintLayout

98

Я хотел бы ограничить левую и правую стороны представления полями родительского представления и заставить его заполнять выделенное пространство. Однако установка ширины на или match_parentили wrap_contentдает тот же результат.

Есть ли что-то эквивалентное match_constraints (в отличие от match_parent и wrap_content)? Есть match_parentи wrap_contentвлияют на расположение или они игнорируются в новом макете ограничения?

Мне нравится эта новая система макетов для моей любимой платформы!

КГ6ЗВП
источник
1
Почему match_parentу тебя не работает?
Eugen Martynov

Ответы:

126

match_parentне поддерживается. С 0dp, вы можете думать о своих ограничениях как о «масштабируемых», а не о «заполнении того, что осталось».

Кроме того, 0dpможет быть определен позицией, где он match_parentполагается на его родительскую позицию (x, y и ширина, высота)

боб
источник
31
почему это принятый ответ?!? match_parent не поддерживается макетом ограничений. И этот ответ не дает возможности его реализовать.
Даниэле Сегато
3
match_parent не поддерживается.
Николас
7
Это правильный ответ. В нем четко указано, что match_parent не поддерживается. Кроме того, чтобы выполнить разумную альтернативу настройке match_parent, 0dp с ограничениями, установленными на родительский слева и справа (маржа 0 или выбор в соответствии с требованиями), даст тот же результат. Единственное, что действительно было упущено в этом ответе, который находится в ответе Арика, - это необходимость установить ограничения с обеих сторон (или сверху и снизу для вертикали). Вот как я это делаю, и у меня не было никаких проблем. Кроме того, он работает как установка веса при использовании с другими компонентами.
Эрик Энгель
Если кто-то придет сюда в поисках ответа, это не сработает. Похоже, что в бете он сломался. Вроде работает в 1.0.2. Извлеченный урок - заморозьте библиотеки, не используйте гибкие обновления.
Inteist 09
1
Комментарий @Tequilaman может быть ответом. Он правильно указал способ его реализации. Создайте ограничение с обеих сторон с полем 0dp, это поможет.
Уткарш Манкад
170

match_parentне допускается. Но на самом деле вы можете установить ширину и высоту равными 0dp и установить верхнее и нижнее или левое и правое ограничения как «родительские».

Так, например, если вы хотите установить match_parentограничение на ширину элемента, вы можете сделать это следующим образом:

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>
Arieck
источник
4
Команда Android должна заставить "match_parent" работать. Это было бы очень просто. Просто сделайте так, чтобы match_parent предоставляла ту же функциональность, как если бы приложение было ограничено началом и концом родительского элемента. Было бы легко обнаружить по вертикали или по горизонтали.
bharv14
Но разве 0dp не приводит к двойному измерению?
Pramod Garg
25

Видимо match_parentэто:

  • НЕ ПОДХОДИТ для просмотров непосредственно подConstraintLayout
  • ОК для представлений, вложенных в представления, которые находятся непосредственно подConstraintLayout

Итак, если вам нужно, чтобы ваши представления функционировали как match_parent, тогда:

  1. Прямые дети из ConstraintLayoutдолжны использовать0dp
  2. Вложенные элементы (например, внучка в ConstraintLayout) могут использоватьmatch_parent

Пример:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="16dp">

    <android.support.design.widget.TextInputLayout
        android:id="@+id/phoneNumberInputLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/phoneNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    </android.support.design.widget.TextInputLayout>
Джин Бо
источник
как насчет ConstraintLayout, вложенного в ConstraintLayout, в вашем примере измените TextInputLayout на ConstraintLayout?
superuser
16

match_parentне поддерживается ConstraintLayout. Установите ширину, чтобы 0dpона соответствовала ограничениям.

Марцин Козиньски
источник
а wrap_content поддерживается?
KG6ZVP 03
Да, насколько я могу судить.
Marcin Koziński
6
wrap_content поддерживается
Romain Guy
13

Из официального документа :

Важно: MATCH_PARENT не рекомендуется для виджетов, содержащихся в ConstraintLayout. Подобное поведение может быть определено с помощью MATCH_CONSTRAINT с соответствующими ограничениями left / right или top / bottom, установленными на «parent».

Итак, если вы хотите добиться MATCH_PARENTэффекта, вы можете сделать это:

<TextView
    android:id="@+id/textView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="TextView"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />
ксимелон
источник
4

Вы можете проверить свой адаптер.

 1 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);
 2 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);

У меня была такая же проблема, как и у вас, когда я использовал 1. Вы можете попробовать 2.

Ким Чжон У
источник
Это золото! Спасибо!
grrigore
3

Сделать ваше представление как match_parent невозможно напрямую, но мы можем сделать это немного по-другому, но не забудьте использовать атрибут Left и Right с Start и End, потому что, если вы используете поддержку RTL, это будет необходимо.

    <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
Шубхам Сантувала
источник
2

установите ширину или высоту (что вам нужно для соответствия родителю) на 0dp и установите поля слева, справа, сверху, снизу, чтобы действовать как родительский элемент

Сантош
источник
1

в офисном документе: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Если для размера задано значение MATCH_CONSTRAINT, по умолчанию полученный размер занимает все доступное пространство.

Использование 0dp, что эквивалентно "MATCH_CONSTRAINT"

Важно: MATCH_PARENT не рекомендуется для виджетов, содержащихся в ConstraintLayout. Подобное поведение может быть определено с помощью MATCH_CONSTRAINT с соответствующими ограничениями left / right или top / bottom, установленными на "parent"

Чуансин Чжао
источник
0

Если вы хотите, чтобы TextView находился в центре родительского элемента ..
Ваш основной макет - Constraint Layout

<androidx.appcompat.widget.AppCompatTextView
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:text="@string/logout"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     android:gravity="center">
</androidx.appcompat.widget.AppCompatTextView>
Хьяти Наик
источник
0

Я нашел еще один ответ, когда внутри представления прокрутки есть макет ограничения, тогда нам нужно поместить

android:fillViewport="true"

к просмотру прокрутки

а также

android:layout_height="0dp"

в компоновке ограничений

Пример:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="0dp">

// Rest of the views

</androidx.constraintlayout.widget.ConstraintLayout>

</ScrollView>
Снеха Мудхигонда
источник