Встановіть ширину, щоб відповідати обмеженням у ConstraintLayout


98

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

Чи існує щось еквівалентне match_constraints (на відміну від match_parent і wrap_content)? Є match_parentі wrap_contentвпливають на розташування або вони ігноруються в новому макеті обмеження?

Люблю цю нову систему компонування для моєї улюбленої платформи!


1
Чому у вас match_parentне виходить?
Євген Мартинов

Відповіді:


125

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

1
Коментар @Tequilaman може бути відповіддю. Він справедливо вказав спосіб його реалізації. Створіть обмеження з обох сторін з полем 0dp, це робить трюк.
Уткарш Манкад

169

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"/>

4
Команда Android повинна змусити "match_parent" працювати. Це було б надзвичайно просто. Просто змусіть match_parent надавати ту саму функціональність, як якщо б програма обмежувалась початком і кінцем батьків. Було б легко виявити вертикально або горизонтально.
bharv14,

Але чи не призводить 0dp до подвійного вимірювання?
Прамод Гарг

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?
суперкористувач


13

З офіційного документа :

Важливо: MATCH_PARENT не рекомендується для віджетів, що містяться в ConstraintLayout. Подібну поведінку можна визначити, використовуючи MATCH_CONSTRAINT з відповідними лівими / правими або верхніми / нижніми обмеженнями, встановленими на "батьківський".

Отже, якщо ви хочете досягти 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 з відповідними лівими / правими або верхніми / нижніми обмеженнями, встановленими на "батьківський"


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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.