4

У меня есть XML-макет для ViewHolder внутри RecyclerView.ConstraintLayout beta5 wrap_content не обрабатывается должным образом

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

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

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

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

Beta4

Извиняюсь за «красной лентой», но это NDA-бла-бла.

При этом, элементы являются:

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

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

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

beta5

Как вы можете увидеть фиолетовый (корень) Constraint Layout теперь «спутать» и не завернуть содержание как это было раньше.

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

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

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

  3. вернуться к beta4 :)

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

<?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!) :)

ответ

5

Я filed a bug об этом, и я получил обходной путь.

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

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

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