Flat ConstraintLayout с layout_constraintHeight_min для каждой строки не работает - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть, как мне кажется, довольно распространенный вариант использования: у меня несколько строк информации на экране.Я надеюсь реализовать эти представления без необходимости использовать вложенные ViewGroups.Каждая строка должна иметь минимальную высоту, но расширяться, если содержимое больше минимальной высоты.Содержимое должно быть вложено вертикально.

Кажется, что этот упрощенный пример должен работать:

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Row"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="@+id/view"
        app:layout_constraintBottom_toBottomOf="@+id/view"/>

    <View
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="#8800ff00"
        app:layout_constraintHeight_min="100dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="@id/textView"/>

</android.support.constraint.ConstraintLayout>

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

Но есть проблема:

enter image description here

ConstraintLayout добавляет нежелательный интервал над строкой!Обратите внимание, что нежелательный интервал над строкой равен правильному интервалу между нижней частью содержимого и нижней частью строки.

Моя теория такова: поскольку нижняя часть представления привязана к нижней части содержимого(TextView) он хочет придерживаться этого и быть рядом с ним.Если я заставляю его двигаться дальше, для этого добавляется что-то вроде нижнего поля, добавляется аналогичное верхнее поле, чтобы оно было симметричным.

Как мне остановить его?Если бы не этот нежелательный интервал сверху, у меня было бы именно то, что мне нужно.Возможно, есть какой-то особый трюк с ConstraintLayout, какой-то магический атрибут, чтобы исправить это поведение.Или, может быть, есть совершенно другой способ использования ConstraintLayout для создания нужного мне пользовательского интерфейса.

Я понимаю, что использование строк фиксированной высоты сделало бы это намного проще, но мне не нравится делать это, если содержимое может расти.

Я мог бы изменить свой пользовательский интерфейс, чтобы иметь вложенный ConstraintLayout для каждой строки, но я бы предпочел не делать этого после такой сложной работы, чтобы сделать сложный макет полностью плоским, без нескольких слоев ViewGroups.Но это то, что я сделаю, если не смогу найти лучшего решения, которое я надеюсь найти здесь.

1 Ответ

0 голосов
/ 29 ноября 2018

Я думаю, что удаление минимальной высоты и добавление некоторого поля в TextView поможет, и вместо использования match_parent вы можете использовать ограничения, если это возможно

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="50dp"
        android:text="Row is not column"
        android:textColor="#283858"
        app:layout_constraintBottom_toBottomOf="@+id/view"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/view"/>

    <View
        android:id="@+id/view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#8800ff00"
        app:layout_constraintBottom_toBottomOf="@id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Here is my output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...