View выталкивается из ограничений в ConstraintLayout

У меня есть ConstraintLayout с ImageView и 3 связанных TextViews со стилем цепочки spread_inside:

<android.support.design.card.MaterialCardView
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content">

    <android.support.constraint.ConstraintLayout
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:paddingBottom = "@dimen/space_normal"
        android:paddingEnd = "@dimen/space_normal"
        android:paddingStart = "@dimen/space_normal"
        android:paddingTop = "@dimen/space_big">

        <ImageView
            android:id = "@+id/ivImage"
            android:layout_width = "@dimen/feed_list_image_size"
            android:layout_height = "@dimen/feed_list_image_size"
            android:layout_marginBottom = "@dimen/space_normal"
            android:contentDescription = "@null"
            app:layout_constraintBottom_toBottomOf = "parent"
            app:layout_constraintEnd_toEndOf = "parent"
            app:layout_constraintTop_toTopOf = "parent"
            app:layout_constraintVertical_bias = "0.0"
            tools:src = "@color/debug_3" />

        <TextView
            android:id = "@+id/tvTitle"
            android:layout_width = "0dp"
            android:layout_height = "wrap_content"
            android:layout_marginEnd = "@dimen/space_normal"
            android:ellipsize = "end"
            android:maxLines = "3"
            android:textSize = "@dimen/text_size_big"
            app:layout_constraintBottom_toTopOf = "@+id/tvContent"
            app:layout_constraintEnd_toStartOf = "@+id/ivImage"
            app:layout_constraintStart_toStartOf = "parent"
            app:layout_constraintTop_toTopOf = "parent"
            app:layout_constraintVertical_chainStyle = "spread_inside"
            app:textAllCaps = "true"
            tools:text = "@tools:sample/lorem" />

        <TextView
            android:id = "@+id/tvContent"
            android:layout_width = "0dp"
            android:layout_height = "wrap_content"
            android:layout_marginBottom = "@dimen/space_big"
            android:layout_marginTop = "@dimen/space_normal"
            android:ellipsize = "end"
            android:maxLines = "4"
            android:textColor = "@color/gray_600"
            android:textSize = "@dimen/text_size_normal"
            app:layout_constraintBottom_toTopOf = "@+id/tvDate"
            app:layout_constraintEnd_toEndOf = "@+id/tvTitle"
            app:layout_constraintStart_toStartOf = "parent"
            app:layout_constraintTop_toBottomOf = "@+id/tvTitle"
            tools:text = "@tools:sample/lorem/random" />

        <TextView
            android:id = "@+id/tvDate"
            style = "@style/AppTheme.ItemFeedList.Date"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:layout_marginBottom = "@dimen/space_normal"
            app:layout_constraintBottom_toBottomOf = "parent"
            app:layout_constraintStart_toStartOf = "parent"
            app:layout_constraintTop_toBottomOf = "@+id/tvContent"
            tools:text = "@tools:sample/date/hhmm" />

    </android.support.constraint.ConstraintLayout>

</android.support.design.card.MaterialCardView>

Это дает красивый и гибкий макет в редакторе:

View выталкивается из ограничений в ConstraintLayout

View выталкивается из ограничений в ConstraintLayout

Но иногда вид сверху «выталкивается» за пределы ограничений, поэтому отрисовка текста неверна (обрезана). Это странно, потому что стиль цепочки spread_inside должен раздувать и сужать средний вид. Из Инспектор компоновки:

View выталкивается из ограничений в ConstraintLayout

Что в этом плохого?

точно такая же проблема, с которой я столкнулся

user2386226 07.06.2018 04:36

Попробуйте установить layout_height на вашем ConstraintLayout на wrap_content. Я подозреваю, что CardViews wrap_content и ConstraintLayouts match_parent конфликтуют друг с другом. ConstraintLayout - единственный дочерний элемент CardView, и все его представления имеют высоту wrap_content.

Pawel Laskowski 07.06.2018 13:59

@plaskoff это не помогает

Nikolay Kulachenko 08.06.2018 08:39
5
3
2 657
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам может помочь изменение, внесенное в версию 1.1 ConstraintLayout. Попробуйте установить app:layout_constrainedHeight=”true” на проблемный TextView. Из руководство разработчика для ConstraintLayout:

WRAP_CONTENT : enforcing constraints (Added in 1.1)

If a dimension is set to WRAP_CONTENT, in versions before 1.1 they will be treated as a literal dimension -- meaning, constraints will not limit the resulting dimension. While in general this is enough (and faster), in some situations, you might want to use WRAP_CONTENT, yet keep enforcing constraints to limit the resulting dimension. In that case, you can add one of the corresponding attribute:

app:layout_constrainedWidth=”true|false”
app:layout_constrainedHeight=”true|false”

Помогает, спасибо! P.S. Я попытался установить app:layout_constraintHeight_default = "wrap", но он ничего не сделал (и устарел для версий 1.1+ ConstraintLayout)

Nikolay Kulachenko 08.06.2018 09:12

Другие вопросы по теме