Равномерное расстояние между видами с помощью ConstraintLayout


С помощью LinearLayout для равномерного пространства (веса) просмотров, например:

как вы реализуете равномерно распределенные представления, как это с помощью нового ConstraintLayout?

ConstraintLayout ссылки для справки: блоге,видео сеанса ввода/вывода

3 101

3 ответа:

есть два способа сделать это с помощью ConstraintLayout:цепи и рекомендации. Чтобы использовать цепочки, убедитесь, что вы используете ConstraintLayout Beta 3 или новее и если вы хотите использовать редактор визуального макета в Android Studio, убедитесь, что вы используете Android Studio 2.3 Beta 1 или новее.

Метод 1-Использование Цепей

откройте редактор макета и добавьте свои виджеты как обычно, добавив родительские ограничения по мере необходимости. В этом случай, я добавил две кнопки с ограничениями в нижней части родителя и стороне родителя (левая сторона для кнопки сохранения и правая сторона для кнопки Share):

enter image description here

обратите внимание, что в этом состоянии, если я переключаюсь на ландшафтный вид, виды не заполняют родительский элемент, а привязаны к углам:

enter image description here

выделите оба вида, либо нажав Ctrl / Cmd, либо перетащив поле вокруг просмотров:

enter image description here

затем щелкните правой кнопкой мыши на представлениях и выберите "Центр по горизонтали":

enter image description here

это устанавливает двунаправленную связь между представлениями (так определяется цепочка). По умолчанию стиль цепочки - "spread", который применяется даже при отсутствии атрибута XML. Придерживаясь этого стиля цепи, но устанавливая ширину наших взглядов на 0dp позволяет представления заполнить доступное пространство, равномерно распределенное по родителю:

enter image description here

это более заметно в ландшафтном виде:

enter image description here

если вы предпочитаете пропустить редактор макета, результирующий XML будет выглядеть так:

<android.support.constraint.ConstraintLayout
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">

<Button
    android:id="@+id/button_save"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="@string/button_save_text"
    android:layout_marginStart="8dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="4dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/button_share"
    app:layout_constraintHorizontal_chainStyle="spread" />

<Button
    android:id="@+id/button_share"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="@string/button_share_text"
    android:layout_marginStart="4dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    app:layout_constraintLeft_toRightOf="@+id/button_save"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintBottom_toBottomOf="parent" />

</android.support.constraint.ConstraintLayout>

детали:

  • установка ширины каждого элемента в 0dp или MATCH_CONSTRAINT позволяет представления заполнить Родительский (необязательно)
  • вид должны быть связаны между собой двунаправленно (справа от кнопки сохранить ссылки на кнопку Поделиться, слева от кнопки поделиться ссылки на кнопку Сохранить), это произойдет автоматически через редактор макета при выборе "Центр по горизонтали"
  • первый вид в цепочке может указать стиль цепи через layout_constraintHorizontal_chainStyle см. документация для различных стилей цепочки, если стиль цепочки опущен, по умолчанию используется "распространение"
  • утяжеление цепи можно отрегулировать через layout_constraintHorizontal_weight
  • этот пример для горизонтальной цепи, есть соответствующие атрибуты для вертикальных цепей

Метод 2-Использование руководства

откройте макет в редакторе и нажмите кнопку направляющие:

enter image description here

затем выберите "Добавить вертикальную направляющую": enter image description here

появится новое руководство, которое по умолчанию, скорее всего, будет закреплено слева в относительных значениях (обозначается стрелкой влево):

layout editor relative guideline

щелкните стрелку влево, чтобы переключить ее на процентное значение, затем перетащите направляющую на отметку 50%:

layout editor percent guideline

руководство теперь можно использовать в качестве якоря для других видов. В моем примере я прикрепил правую кнопку сохранения и левую кнопку share к руководство:

final layout

если вы хотите, чтобы виды заполняли доступное пространство, то ограничение должно быть установлено на " любой размер "(волнистые линии, идущие горизонтально):

any size constraint

(это то же самое, что установить layout_width до 0dp).

руководство также может быть создано в XML довольно легко, а не с помощью редактора макета:

<android.support.constraint.Guideline
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/guideline"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5" />

Ну если это кому-то поможет

the ключ здесь app:layout_constraintHorizontal_weight="1" и
самое лучшее в компоновке ограничений - это то, что она поддерживает циклическую зависимость, и вот что я сделал, используя именно это.

для первого ребенка
app:layout_constraintEnd_toStartOf="@+id/textInputSecondChild"

для второго ребенка

app:layout_constraintLeft_toRightOf="@+id/textInputFirstChild"

вот пример

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

    <EditText
        android:id="@+id/editTextParent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/state" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:id="@+id/textInputFirstChild"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintEnd_toStartOf="@+id/textInputSecondChild"
    app:layout_constraintHorizontal_weight="1"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textInputParent">

    <EditText
        android:id="@+id/editTextChildOne"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/pin_code" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:id="@+id/textInputSecondChild"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintHorizontal_weight="1"
    app:layout_constraintLeft_toRightOf="@+id/textInputFirstChild"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textInputParent">

    <EditText
        android:id="@+id/editTextChildSecond"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/country" />
</android.support.design.widget.TextInputLayout>

вы должны прочитать о взвешенных цепей. Пример кода находится здесь.

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

    <TextView
        android:id="@+id/figure_1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        app:layout_constraintEnd_toStartOf="@id/figure_2"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toStartOf="parent"
        tools:text="1"
        />

    <TextView
        android:id="@+id/figure_2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        app:layout_constraintEnd_toStartOf="@id/figure_3"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@id/figure_1"
        tools:text="2"
        />

    <TextView
        android:id="@+id/figure_3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        app:layout_constraintEnd_toStartOf="@id/figure_4"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@id/figure_2"
        tools:text="3"
        />

    <TextView
        android:id="@+id/figure_4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@id/figure_3"
        tools:text="4"
        />
</android.support.constraint.ConstraintLayout>

Итак, set android:layout_width="0dp",app:layout_constraintHorizontal_weight="1" и связать каждый вид с соседями, как:

app:layout_constraintStart_toEndOf="@id/figure_2"
app:layout_constraintEnd_toStartOf="@id/figure_4"

enter image description here