#android #android-constraintlayout #constraint-layout-chains
#Android #android-constraintlayout #constraint-layout-цепочки
Вопрос:
У меня возникла проблема с расширением цепочки из 2 групп элементов с макетом ограничений. Я понимаю, что цель этого нового макета — использовать плоскую иерархию, поэтому я бы хотел избежать размещения своих элементов внутри дочерних макетов.
Я посмотрел на некоторые потрясающие ресурсы, такие как constraintlayout.com но не смог понять, как заставить это работать в моем конкретном случае, который, я думаю, может быть распространенным..
Вот изображение того, чего я хотел бы достичь. Красным цветом пробелы 1, 2 и 3 должны иметь одинаковую высоту (точно так же, как spread chain).
Спасибо за ваше внимание 🙂
Комментарии:
1. Что вы уже пробовали?
2. Я попытался добавить 2 пустых представления (EV1 и EV2). Выровняйте верхнюю часть ViewA по верхней части EV1, нижнюю часть ViewC по нижней части EV1, но это не изменило высоту EV1. Затем я собирался сделать то же самое со второй группой (ViewD и ViewE выровнены с EV2). И, наконец, я бы сделал цепочку распространения на EV1 и EV2.
Ответ №1:
Вы можете достичь этого с помощью:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@ id/button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@ id/button2"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@ id/button2"
app:layout_constraintTop_toBottomOf="@ id/button"
app:layout_constraintBottom_toTopOf="@ id/button3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@ id/button3"
app:layout_constraintTop_toBottomOf="@ id/button2"
app:layout_constraintBottom_toTopOf="@ id/space"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<Space
android:id="@ id/space"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@ id/button4"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@ id/button4"
app:layout_constraintTop_toBottomOf="@ id/button3"
app:layout_constraintBottom_toTopOf="@ id/button5"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@ id/button5"
app:layout_constraintTop_toBottomOf="@ id/button4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Комментарии:
1. Это, похоже, решение, глядя на ваш скриншот, но я не понимаю, как это работает. Для меня уже поздно, поэтому я еще подумаю и попробую завтра (и пометьте это как решение). Почему я должен использовать chainstyle только для кнопок 1 и 4 и присваивать ему упакованное значение? Спасибо за помощь
2. Хорошо, попробуйте это завтра и дайте мне знать ваши отзывы.
3. @Antoine: У тебя есть шанс разобраться в этом?
4. Все хорошо, я попробовал это, и это работает так, как ожидалось. Мне потребовалось некоторое время, чтобы понять, что вы написали, и теперь это имеет смысл, большое спасибо!
5. Спасибо за это блестящее решение! Если я правильно понимаю, в основном здесь есть две цепочки (двунаправленно связанные представления) в виде двух групп кнопок.
View
(или на самом делеSpace
с0dp
высотой лучше) используется для привязки вершины второй цепочки и позволяет нижней части первой цепочки подключаться к ней, так что обе цепочки полностью соединены по вертикали, а ConstraintLayout равномерно распределяет пространство между ними. Я думаю, что это может работать с 3 группами, добавив привязкуSpace
для нижней части второй группы и другую привязкуSpace
для верхней части третьей группы.