Как заставить View заполнять оставшееся пространство в ConstraintsLayout

Как заставить View FrameLayout заполнить все оставшееся пространство в ConstraintLayout

У меня xml вроде:

<ImageView
    android:background = "#FF0000"
    android:id = "@+id/header"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:src = "@drawable/ic_header"
    android:scaleType = "fitXY"
    android:adjustViewBounds = "true"
    app:layout_constraintTop_toTopOf = "parent"
    app:layout_constraintStart_toStartOf = "parent"
    app:layout_constraintEnd_toEndOf = "parent"
    app:layout_constraintHeight_default = "wrap"
    app:layout_constraintWidth_default = "spread"/>
<FrameLayout
    android:background = "#00FF00"
    app:layout_constraintHeight_default = "spread"
    app:layout_constraintWidth_default = "wrap"
    app:layout_constraintTop_toBottomOf = "@id/header"
    app:layout_constrainedHeight = "true"
    app:layout_constraintBottom_toTopOf = "@id/footer"
    android:id = "@+id/task_fragment"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"/>
<LinearLayout
    android:background = "#FFFF00"
    android:orientation = "vertical"
    android:id = "@+id/footer"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:layout_alignParentBottom = "true"
    app:layout_constraintStart_toStartOf = "parent"
    app:layout_constraintEnd_toEndOf = "parent"
    app:layout_constraintHeight_default = "spread"
    app:layout_constraintWidth_default = "spread"
    app:layout_constraintBottom_toBottomOf = "parent">
    <ImageButton
        style = "?borderlessButtonStyle"
        android:id = "@+id/btn_ar"
        android:layout_height = "wrap_content"
        android:layout_width = "match_parent"
        android:padding = "0dp"
        android:scaleType = "fitXY"
        android:adjustViewBounds = "true"
        android:src = "@drawable/ic_ar"/>
</LinearLayout>

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

Я не понимаю, какие свойства мне нужно использовать для расширения FrameLayout. Пожалуйста, помоги мне!

Обновлено: Или любое решение с другим макетом.

21
0
11 635
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Эта работа идет с ConstraintLayout, потому что имеет лучшую производительность.

<?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">

    <ImageView
        android:background = "#FF0000"
        android:id = "@+id/header"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:src = "@drawable/ic_header"
        android:minHeight = "30dp"
        android:scaleType = "fitXY"
        android:adjustViewBounds = "true"
        app:layout_constraintTop_toTopOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintHeight_default = "wrap"
        app:layout_constraintWidth_default = "spread"/>

    <FrameLayout
        android:id = "@+id/task_fragment"
        android:layout_width = "match_parent"
        android:layout_height = "0dp"
        android:background = "#00FF00"
        android:orientation = "vertical"
        app:layout_constrainedHeight = "true"
        app:layout_constraintBottom_toTopOf = "@+id/btn_ar"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintHeight_default = "spread"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toBottomOf = "@id/header"
        app:layout_constraintWidth_default = "wrap">

    </FrameLayout>

    <ImageButton
        android:id = "@+id/btn_ar"
        style = "?borderlessButtonStyle"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:adjustViewBounds = "true"
        android:padding = "0dp"
        android:scaleType = "fitXY"
        android:src = "@drawable/ic_ar"
        app:layout_constraintBottom_toBottomOf = "parent" />

</android.support.constraint.ConstraintLayout>
<FrameLayout
    android:id = "@+id/task_fragment"
    android:layout_width = "match_parent"
    android:layout_height = "0dp"
    android:background = "#00FF00"
    android:orientation = "vertical"
    app:layout_constrainedHeight = "true"
    app:layout_constraintBottom_toTopOf = "@+id/btn_ar"
    app:layout_constraintEnd_toEndOf = "parent"
    app:layout_constraintHeight_default = "spread"
    app:layout_constraintStart_toStartOf = "parent"
    app:layout_constraintTop_toBottomOf = "@id/header"
    app:layout_constraintWidth_default = "wrap">

</FrameLayout>

Это должно сработать.

Объяснение:

Все, что вам нужно, - это сделать верхнюю часть этого ограничения FrameLayout нижней частью заголовка, а нижнюю часть этого ограничения FrameLayout - верхней частью нижнего колонтитула.

После установки всех ограничений вам все равно нужно установить параметр макета FrameLayout в соответствии с ограничением. Для этого вы можете попробовать установить layout_height на 0dp. Это приведет к тому, что высота FrameLayout будет иметь эффект match_constraint.

Для получения дополнительной информации вы можете проверить этот документ: https://developer.android.com/reference/android/support/constraint/ConstraintLayout (просто выполните поиск по ключевому слову match constraint, и вы найдете этот блок) или просто проверьте этот аналогичный ответ: Установите ширину в соответствии с ограничениями в ConstraintLayout

Это действительно просто. Чтобы любой вид занимал доступное пространство по горизонтали или вертикали, просто установите layout_width / layout_height на 0dp в соответствии с вашими потребностями.

Чтобы немного уточнить, после установки 0dp установите верхнюю часть родительского элемента или нижнюю часть представления сверху и установите нижнюю часть родительского элемента или верхнюю часть обзора ниже.

Joseph Sang 04.09.2020 10:43

Хороший и сладкий ответ

King Of The Jungle 21.09.2020 11:26

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