Есть два способа сделать это, используя ConstraintLayout
: Цепочки и Рекомендации . Чтобы использовать цепочки, убедитесь, что вы используете ConstraintLayout
бета-версию 3 или новее, и если вы хотите использовать редактор визуального макета в Android Studio, убедитесь, что вы используете Android Studio 2.3 бета-версию 1 или новее.
Метод 1 - Использование цепочек
Откройте редактор макетов и добавьте виджеты как обычно, добавив родительские ограничения по мере необходимости. В этом случае я добавил две кнопки с ограничениями в нижней части родителя и на стороне родителя (левая сторона для кнопки «Сохранить» и правая сторона для кнопки «Поделиться»):
Обратите внимание, что в этом состоянии, если я переключу на альбомный вид, представления не заполняют родительский, а привязываются к углам:
Выделите оба вида, нажав Ctrl / Cmd или перетащив рамку вокруг видов:
Затем щелкните правой кнопкой мыши на видах и выберите «Центр по горизонтали»:
Это устанавливает двунаправленную связь между представлениями (так определяется цепочка). По умолчанию стиль цепочки является «распространенным», который применяется, даже если атрибут XML не включен. Придерживаясь этого стиля цепочки, но устанавливая ширину наших представлений, чтобы 0dp
представления заполняли доступное пространство, равномерно распределяясь по родительскому элементу:
Это более заметно в альбомной ориентации:
Если вы предпочитаете пропустить редактор макетов, результирующий 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 - Использование руководства
Откройте свой макет в редакторе и нажмите кнопку направляющей:
Затем выберите «Добавить вертикальную направляющую»:
Появится новое руководство, которое по умолчанию, скорее всего, будет привязано к левому краю в относительных значениях (обозначено левой стрелкой):
Нажмите стрелку влево, чтобы переключить ее на процентное значение, затем перетащите направляющую до отметки 50%:
Теперь руководство можно использовать в качестве привязки для других видов. В моем примере я прикрепил правую кнопку сохранения и левую кнопку общего доступа к направляющей:
Если вы хотите, чтобы представления заполняли доступное пространство, тогда ограничение должно быть установлено на «Любой размер» (волнистые линии, идущие горизонтально):
(Это то же самое , как установка layout_width
To 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" />
Чтобы создать 2 вида в одну линию, равную ширину, просто нужно определить
Заметка
MATCH_CONSTRAINT
)button1
иbutton2
должно нравиться вышерезультат
БОЛЬШЕ
Если вы хотите
View1
больше, чемView2
вы можете использоватьweight
илиpercent
.Например,
View1
ширина = 2 *View2
ширина использовать весрезультат
Пример:
View1
ширина = 2 *View2
ширина в процентахрезультат
источник
Ну если кому то поможет
ключ здесь
app:layout_constraintHorizontal_weight="1"
илучше всего об ограничении компоновки является то , что он поддерживает циклическую зависимость и вот это то , что я сделал , используя именно это.
Для первого ребенка
app:layout_constraintEnd_toStartOf="@+id/textInputSecondChild"
Для второго ребенка
app:layout_constraintLeft_toRightOf="@+id/textInputFirstChild"
вот полная демонстрация
источник
Вы должны прочитать о взвешенных цепях. Пример кода здесь.
Таким образом, установить
android:layout_width="0dp"
,app:layout_constraintHorizontal_weight="1"
и связать каждый вид с соседями , как:источник
ConstraintLayout
, и только первого ответа было недостаточно, чтобы получить картину выше.После того, как у вас есть связанные элементы, вы все равно можете использовать их веса, например относительную компоновку, чтобы они оставались равномерно распределенными. В приведенном ниже примере показано, как сохранить их равномерно расположенными с различными размерами textViews
источник