Como mencionado acima, o ConstraintLayout oferece altura máxima para seus filhos via:
app:layout_constraintHeight_max="300dp"
app:layout_constrainedHeight="true"
Além disso, se a altura máxima para um filho de um ConstraintLayout for incerta até a execução do aplicativo, ainda há uma maneira de fazer com que esse filho adapte automaticamente uma altura mutável, independentemente de onde foi colocada na cadeia vertical.
Por exemplo, precisamos mostrar uma caixa de diálogo inferior com um cabeçalho mutável TextView, um ScrollView mutável e um rodapé mutável TextView. A altura máxima da caixa de diálogo é 320dp , quando a altura total não atinge 320dp, o ScrollView atua como wrap_content, quando a altura total excede o ScrollView, atua como "maxHeight = 320dp - altura do cabeçalho - altura do rodapé".
Podemos conseguir isso apenas através do arquivo de layout 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>
A maioria dos códigos de importação é curta:
app:layout_constraintVertical_bias="1"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constrainedHeight="true"
O uso horizontal de maxWidth é o mesmo.