Как вы можете сделать Constraint Layout сопротивляться расширению, чтобы покрыть другие представления - PullRequest
0 голосов
/ 02 июня 2018

У меня есть макет ограничения, и внутри него у меня есть вид заголовка и вид нижнего колонтитула

Это якоря, между которыми есть EditText a RecyclerView и Button, которые связанывместе.

Макет выглядит следующим образом:

<?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="match_parent"
    android:paddingBottom="@dimen/app_padding">


    <TextView
        android:id="@+id/header"
        style="@style/app_text.large"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="@dimen/app_padding"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Hello Header" />

    <EditText
        android:id="@+id/filter"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toTopOf="@+id/list"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/header"
        app:layout_constraintVertical_chainStyle="packed" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/list"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toTopOf="@+id/add"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/filter" />

    <Button
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toTopOf="@+id/footer"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/list" />


    <TextView
        android:id="@+id/footer"
        style="@style/app_text.large"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="@dimen/app_padding"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        tools:text="Hello footer" />
</android.support.constraint.ConstraintLayout>

Это выглядит так, как я хочу, список с несколькими элементами, который всегда центрируется на экране.

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

Установка значения layout_height в 0dp позволяет решить проблему, но тогда список всегдазанимает большую часть экрана (даже с очень небольшим количеством элементов), и Button всегда застревает над нижним колонтитулом, а EditText всегда застревает под верхним колонтитулом.

Есть ли способ сделать RecyclerView иметь wrap_content в качестве высоты макета, но каким-то образом быть ограниченным, чтобы никогда не становиться таким большим, чтобы покрывать заголовок?

Я бы предпочел решение, которое не предусматривает установку максимальной высоты, потому что этодолжен бежатьна нескольких размерах экрана

1 Ответ

0 голосов
/ 02 июня 2018

Вам нужно установить атрибут app:layout_constrainedHeight="true" на RecyclerView.Это позволяет использовать wrap_content на высоте view, но продолжать применять ограничения, чтобы ограничить результирующую высоту.

...