ConstraintLayout beta5 wrap_content не переносится должным образом

У меня есть макет XML для ViewHolder внутри RecyclerView.

Корнем этого макета является ConstraintLayout, высота которого установлена ​​на wrap_content.

Внутри этой плоской иерархии есть 3 текстовых представления и представление изображения с фиксированной высотой; думать о:

<ConstraintLayout>
     <TextView height=wrap>
     <TextView height=wrap>
     <TextView height=wrap>
     <ImageView height=150dp>
</ConstraintLayout>

Это относительно простой макет. В beta4 вот как это выглядит в конструкторе (и, в конечном итоге, во время выполнения, в каждой ячейке recyclerView):

Бета4

Извиняюсь за "бюрократизм", но это бла-бла о неразглашении.

При этом элементы таковы:

3 текстовых представления (красная лента с красивым фиолетовым фоном). ImageView с высотой 150 dp — это серая вещь.

Фиолетовый фон был применен к корневому ConstraintLayout. Все хорошо.

Теперь вот как это выглядит, без единой модификации с Beta 5:

бета5

Как вы можете видеть, Purple (root) Constraint Layout теперь «запутался» и не переносит содержимое, как раньше.

Что я пробовал:

  1. Добавление app:layout_constraintHeight_default="wrap" в ConstraintLayout (и распространение тоже). Не имеет значения.

  2. У ImageView есть ограничение app:layout_constraintBottom_toBottomOf="parent", которое я пытался удалить, но это тоже не имело значения.

  3. Вернитесь к бета4 :)

Для справки, это полный макет (идентификаторы были переименованы по бюрократическим причинам, а инструменты: текст или что-то подобное по тем же причинам). В остальном планировка точно такая же.

<?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="wrap_content"
    android:background="@color/colorAccent">

    <TextView
        android:id="@+id/toplabel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text=""
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="@+id/top_bottom_label"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/top_right_label"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/top_right_label"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        android:ellipsize="end"
        android:gravity="end"
        android:maxLines="1"
        android:text=""
        app:layout_constraintBottom_toTopOf="@+id/top_bottom_label"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintLeft_toRightOf="@+id/toplabel"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_chainStyle="packed" />

    <TextView
        android:id="@+id/top_bottom_label"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        android:ellipsize="end"
        android:gravity="end"
        android:maxLines="1"
        android:text=""
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintLeft_toRightOf="@+id/toplabel"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/top_right_label" />

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="0dp"
        android:layout_height="150dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/top_bottom_label"
        app:srcCompat="@android:color/darker_gray" />

</android.support.constraint.ConstraintLayout>

Я должен сделать что-то другое? (Я знаю, что могу заменить это на RelativeLayout и, вероятно, сделать то же самое, но в любом случае… я верю в ConstraintLayout!) :)


person Martin Marconcini    schedule 10.02.2017    source источник


Ответы (1)


Я сообщил об ошибке по этому поводу, и я нашел обходной путь.

Это регресс и будет исправлено (мы надеемся), но... оказывается, моя Цепочка тоже определена неправильно. Мой top_bottom_label не имеет нижней конечной точки, и, согласно документации, элементы в цепочке должны быть соединены на обеих конечных точках.

Поэтому я добавил app:layout_constraintBottom_toTopOf="@id/imageview" к top_bottom_label, и, похоже, это работает для моего случая. Я эффективно добавил imageView в цепочку, даже если мне это не очень важно. Это работает на данный момент.

Обновление от 14 февраля 2017 г.: команда ConstraintLayout в Google устранила проблему в мастере. Скорее всего, это будет исправлено в следующем релизе. (Спасибо!).

person Martin Marconcini    schedule 10.02.2017