Как упомянуто выше, ConstraintLayout предлагает максимальную высоту для своих детей через:
app:layout_constraintHeight_max="300dp"
app:layout_constrainedHeight="true"
Кроме того, если максимальная высота для одного дочернего элемента ConstraintLayout остается неопределенной до запуска приложения, все еще есть способ заставить этого дочернего элемента автоматически адаптировать изменяемую высоту независимо от того, где он был расположен в вертикальной цепочке.
Например, нам нужно показать нижний диалог с изменяемым заголовком TextView, изменяемым ScrollView и изменяемым нижним колонтитулом TextView. Максимальная высота диалога составляет 320 dp ,, когда общая высота не достигает 320dp. ScrollView действует как wrap_content, когда общая высота превышает ScrollView, действует как «maxHeight = 320dp - высота заголовка - высота нижнего колонтитула».
Мы можем добиться этого только с помощью файла макета XML:
<?xml version="1.0" encoding="utf-8"?>
<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="320dp">
<TextView
android:id="@+id/tv_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/black_10"
android:gravity="center"
android:padding="10dp"
app:layout_constraintBottom_toTopOf="@id/scroll_view"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1"
app:layout_constraintVertical_chainStyle="packed"
tools:text="header" />
<ScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/black_30"
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toTopOf="@id/tv_footer"
app:layout_constraintHeight_max="300dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_header">
<LinearLayout
android:id="@+id/ll_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_sub1"
android:layout_width="match_parent"
android:layout_height="160dp"
android:gravity="center"
android:textColor="@color/orange_light"
tools:text="sub1" />
<TextView
android:id="@+id/tv_sub2"
android:layout_width="match_parent"
android:layout_height="160dp"
android:gravity="center"
android:textColor="@color/orange_light"
tools:text="sub2" />
</LinearLayout>
</ScrollView>
<TextView
android:id="@+id/tv_footer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/black_50"
android:gravity="center"
android:padding="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/scroll_view"
tools:text="footer" />
</android.support.constraint.ConstraintLayout>
Большая часть кода импорта короткая:
app:layout_constraintVertical_bias="1"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constrainedHeight="true"
Максимальное использование по горизонтали - то же самое.