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

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

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


person KG6ZVP    schedule 02.06.2016    source источник
comment
Почему match_parent у вас не работает?   -  person Eugen Martynov    schedule 03.06.2016


Ответы (11)


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

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

person brob    schedule 05.07.2016
comment
почему это принятый ответ?!? match_parent не поддерживается макетом ограничений. И этот ответ не дает возможности его реализовать. - person Daniele Segato; 21.09.2016
comment
match_parent не поддерживается. - person Nicolas Roard; 13.01.2017
comment
Это правильный ответ. В нем четко указано, что match_parent не поддерживается. Кроме того, чтобы выполнить разумную альтернативу настройке match_parent, 0dp с ограничениями, установленными для parent слева и справа (маржа 0 или выбор в соответствии с требованиями), даст тот же результат. Единственное, что действительно было упущено в этом ответе, который находится в ответе Арика, - это необходимость установить ограничения с обеих сторон (или сверху и снизу для вертикали). Вот как я это делаю, и у меня не было никаких проблем. Кроме того, он работает как установка веса при использовании с другими компонентами. - person Eric Engel; 10.03.2017
comment
Если кто-то придет сюда в поисках ответа, это не сработает. Похоже, что в бете сломалось. Вроде работает в 1.0.2. Извлеченный урок - заморозьте библиотеки, не используйте гибкие обновления. - person inteist; 09.03.2018
comment
Комментарий @Tequilaman может быть ответом. Он правильно указал способ его реализации. Создайте ограничение с обеих сторон с полем 0dp, это поможет. - person Utkarsh Mankad; 15.11.2018

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"/>
person Arieck    schedule 26.10.2016
comment
Команда Android должна заставить match_parent работать. Это было бы очень просто. Просто сделайте так, чтобы match_parent предоставляла ту же функциональность, как если бы приложение было ограничено началом и концом родительского элемента. Было бы легко обнаружить по вертикали или горизонтали. - person bharv14; 26.04.2018
comment
Но разве 0dp не приводит к двойному измерению? - person Pramod Garg; 06.06.2018

Судя по всему 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>
person Gene Bo    schedule 18.02.2017
comment
как насчет ConstraintLayout, вложенного в ConstraintLayout, в вашем примере изменить TextInputLayout на ConstraintLayout? - person superuser; 01.11.2017
comment
@superuser Тогда это макет ограничения, применяются те же правила. 0dp - person Mohsin Falak; 16.06.2021

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

person Marcin Koziński    schedule 03.06.2016
comment
а wrap_content поддерживается? - person KG6ZVP; 03.06.2016
comment
Да, насколько я могу судить. - person Marcin Koziński; 03.06.2016
comment
wrap_content поддерживается - person Romain Guy; 22.06.2016

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

Важно: 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" />
person xymelon    schedule 03.12.2017

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

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

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

person Kim Jeong woo    schedule 21.02.2019
comment
Это золото! Спасибо! - person grrigore; 04.11.2019

Сделать ваше представление как 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"/>
person Shubham Santuwala    schedule 19.09.2017

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

person santhosh    schedule 18.04.2017

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

Когда для размера задано значение MATCH_CONSTRAINT, поведение по умолчанию заключается в том, что результирующий размер занимает все доступное пространство.

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

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

person Chuanxing Zhao    schedule 24.06.2018

Если вы хотите, чтобы 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>
person khyati naik    schedule 27.11.2019

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

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>
person Sneha Mudhigonda    schedule 28.05.2020