Проблема при попытке обернуть цепочки представлений с ограниченной шириной - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь реализовать очень распространенный подход гибкости портретной / альбомной компоновки с использованием недавно представленного помощника ConstraintLayout Flow в режиме обтекания цепочки.

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

<androidx.constraintlayout.widget.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:background="#B0B0B0">

    <androidx.constraintlayout.helper.widget.Flow
        android:layout_width="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:flow_wrapMode="chain"
        app:constraint_referenced_ids="view1,view2"
        android:layout_height="0dp" />

    <View
        android:id="@+id/view1"
        android:layout_width="0dp"
        android:layout_height="200dp"
        app:layout_constraintDimensionRatio="1:1"
        android:background="#808080"
        tools:ignore="MissingConstraints">
    </View>

    <View
        android:id="@+id/view2"
        android:layout_width="0dp"
        android:layout_height="200dp"
        app:layout_constraintDimensionRatio="1:1"
        android:background="#E0E0E0"
        tools:ignore="MissingConstraints">
    </View>

</androidx.constraintlayout.widget.ConstraintLayout>

Я получаю это для пейзажа, и это нормально:

landscape

Но я получаю это для портрета:

portrait, unexpected

Если я установлю фиксированную ширину 200dp (или wrap_content для других случаев тоже нормально), все будет работать как положено:

portrait, expected

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

Но, может быть, я что-то упустил? Спасибо

1 Ответ

0 голосов
/ 30 мая 2019

Ориентация по умолчанию для виджета Flow горизонтальная.Следовательно, ему нужно знать layout_width значения своих виджетов, на которые ссылаются.

Кажется, что Flow не может рассчитать эти значения на основе app:layout_constraintDimensionRatio (по крайней мере, не в предварительном просмотре инструментов ..Я не проверял, как он ведет себя во время выполнения).

В своем коде вы можете поменять местами значения layout_width и layout_height для достижения желаемых результатов.

<androidx.constraintlayout.widget.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"
    tools:ignore="MissingConstraints">

    <androidx.constraintlayout.helper.widget.Flow
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:constraint_referenced_ids="view_red, view_blue"
        app:flow_wrapMode="chain"/>

    <View
        android:id="@+id/view_red"
        android:layout_width="300dp"
        android:layout_height="0dp"
        android:background="#C62828"
        app:layout_constraintDimensionRatio="1:1"/>

    <View
        android:id="@+id/view_blue"
        android:layout_width="300dp"
        android:layout_height="0dp"
        android:background="#1565C0"
        app:layout_constraintDimensionRatio="1:1"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Однако,имейте в виду, что связывание / перенос происходит только в том случае, если указанные виджеты не соответствуют указанной ориентации (по умолчанию: горизонтальный).В моем коде я должен был установить layout_width на 300dp для формирования цепочки в предварительном просмотре инструментов.

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

...