Как заставить 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. Пожалуйста, помоги мне!
Обновлено: Или любое решение с другим макетом.
Эта работа идет с 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 установите верхнюю часть родительского элемента или нижнюю часть представления сверху и установите нижнюю часть родительского элемента или верхнюю часть обзора ниже.