ConstraintLayout не учитывает максимальную высоту

Я пытаюсь создать композицию макета, используя ConstraintLayout. Чтобы упростить мой случай, мой макет должен состоять из трех частей:

  1. Первый макет (красный), который должен расти в соответствии с оставшимся пространством и иметь максимальную высоту.
  2. Второй макет (выделен зеленым цветом) имеет фиксированный размер 150 dp и всегда должен быть ниже первого макета.
  3. Первый макет (в розовом цвете) также имеет фиксированный размер 150dp и должен быть выровнен по нижнему виду.

Часть, с которой я борюсь, это установка максимальной высоты для первого макета (красный). Кажется, что ConstraintLayout игнорирует мои "операторы максимальной высоты":

app:layout_constraintHeight_max="300dp"

Вот мой текущий результат (красная часть игнорирует ограничение высоты..):

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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
tools:context="com.mixtiles.android.reviewOrder.ReviewOrderActivity"
tools:layout_editor_absoluteY="25dp">


<android.support.design.widget.AppBarLayout
    android:id="@+id/appBarLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white">
        <android.support.v7.widget.Toolbar
            android:id="@+id/review_order_toolbar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:elevation="4dp"
            android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
        </android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>

<FrameLayout
    android:id="@+id/red"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@color/red"
    app:layout_constraintBottom_toTopOf="@+id/green"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHeight_max="300dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/appBarLayout"
    app:layout_constraintVertical_chainStyle="spread_inside">

</FrameLayout>


<FrameLayout
    android:id="@+id/green"
    android:layout_width="0dp"
    android:layout_height="150dp"
    android:background="@color/greenish"
    app:layout_constraintBottom_toTopOf="@+id/pink"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/red">

</FrameLayout>

<FrameLayout
    android:id="@+id/pink"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:background="@color/pink"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/green">

</FrameLayout>

Ответ 1

android:layout_height="wrap_content"
app:layout_constraintHeight_max="300dp"
app:layout_constrainedHeight="true"

обязательно установите высоту wrap_content

Ответ 2

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

app:layout_constraintBottom_toTopOf="@+id/green" app:layout_constraintTop_toBottomOf="@+id/appBarLayout"

Если оба этих ограничения установлены, тогда красный вид будет прикреплен сверху к appBarLayout, а внизу - к зеленому, а это означает, что он будет занимать все пространство между этими двумя видами.

Если вы хотите, чтобы ограничение максимальной высоты было соблюдено, вам нужно удалить одно из этих двух ограничений. Какой из них следует удалить, зависит от того, какой конечный результат вы ожидаете.

OLD ANSWER

Я думаю, вы должны использовать android:maxHeight вместо app:layout_constraintHeight_max.