【发布时间】:2021-04-10 08:33:07
【问题描述】:
目前,我正在尝试使我的视图的高度和宽度相对于可用空间,因此我的 ui 将更加负责。我遇到的问题是,每当我尝试将此布局包含在父布局中(例如在 fragment_shop 中包含 shop_content)时,我包含的布局的高度和宽度不再起作用。
我做了一个小例子来说明这一点。在此示例中,您可以看到工具栏的高度应为给定高度的 17%。当我查看子布局中的设计选项卡时,一切正常,但是在我的 fragment_shopping_cart 中导入此布局时,视图仍然不可见/高度未正确显示。
child_layout
<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"> <!-- Changing this to wrap_content makes weird stuff -->
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/calibrate_btn_background"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/color_primary"
android:clickable="false"
app:layout_constraintHeight_percent="0.17" <!-- Height should take 0.17 -->
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
parent_layout
<layout
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">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".framework.ui.view.fragments.shop.ShoppingCartFragment">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/shopping_cart_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_primary"
app:title="@string/bottom_nav_shopping_cart"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</com.google.android.material.appbar.MaterialToolbar>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_shopping_cart"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="@id/shopping_cart_btn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/shopping_cart_toolbar"
tools:listitem="@layout/shopping_cart_list_item" />
<include
android:id="@+id/shopping_cart_btn"
layout="@layout/child_layout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
它应该是什么样子
外观如何
我在这里做错了什么?我感谢每一个帮助。注意:我是 Android 响应式 ui 的新手
编辑
随着这个问题越来越难以理解,我将尝试用这个例子更好地解释它:我有一个名为 app_standard_checkout_btn 的布局,我在我的几个布局(包括它)中使用它。此布局包含不同的视图,例如 工具栏(用作背景)、文本视图和其他内容。
目前,工具栏 的高度已修复为 124dp,这就是问题所在。我不希望高度为 124dp,而是为包含布局的整个可用高度的 0.15(在某些情况下与 124dp 相同)。这是如何实现的?
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="price"
type="Float" />
<variable
name="btnText"
type="String" />
<variable
name="btnIcon"
type="android.graphics.drawable.Drawable" />
<variable
name="btnTextCapitalized"
type="Boolean" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/calibrate_btn_background"
android:layout_width="match_parent"
android:layout_height="124dp" <!-- THIS FIXED VALUE IS BAD -->
android:background="@color/color_btn_gray"
android:clickable="false"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/calibrate_btn_tv_sum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/standard8dpMargin"
android:layout_marginEnd="@dimen/big16dpMargin"
android:text="@string/calibrate_btn_price"
android:textColor="@color/color_text_dark"
android:textSize="@dimen/textHeadlineNormal2"
app:layout_constraintEnd_toStartOf="@+id/shop_item_price"
app:layout_constraintTop_toTopOf="@+id/calibrate_btn_background" />
<TextView
android:id="@+id/shop_item_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{price}"
android:textColor="@color/color_text_blue"
android:textSize="@dimen/textHeadlineNormal2"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@+id/calibrate_btn_tv_sum"
app:layout_constraintEnd_toStartOf="@+id/calibbrate_btn_tv_intern_curr"
app:layout_constraintTop_toTopOf="@+id/calibrate_btn_tv_sum"
tools:text="4800.00" />
<TextView
android:id="@+id/calibbrate_btn_tv_intern_curr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/currency"
android:textColor="@color/color_text_blue"
android:textSize="@dimen/textHeadlineNormal2"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@+id/shop_item_price"
app:layout_constraintEnd_toEndOf="@+id/calibrate_btn_next"
app:layout_constraintTop_toTopOf="@+id/shop_item_price" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/calibrate_btn_tv_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="@string/calibrate_btn_desc"
android:textColor="@color/color_text_gray"
android:textSize="@dimen/textDescriptionNormal4"
app:layout_constraintEnd_toEndOf="@+id/calibrate_btn_next"
app:layout_constraintTop_toBottomOf="@+id/shop_item_price" />
<com.google.android.material.button.MaterialButton
android:id="@+id/calibrate_btn_next"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="@dimen/big16dpMargin"
android:layout_marginEnd="@dimen/big16dpMargin"
android:layout_marginBottom="@dimen/standard8dpMargin"
android:clickable="true"
android:focusable="true"
android:text="@{btnText}"
android:textAllCaps="@{btnTextCapitalized}"
android:textSize="@dimen/textDescriptionNormal1"
android:textStyle="normal"
app:backgroundTint="@color/color_btn_blue"
app:icon="@{btnIcon}"
app:iconGravity="textStart"
app:layout_constraintBottom_toBottomOf="@id/calibrate_btn_background"
app:layout_constraintEnd_toEndOf="@id/calibrate_btn_background"
app:layout_constraintStart_toStartOf="@+id/calibrate_btn_background" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
【问题讨论】:
-
发布答案后我想到了一些东西..你需要
17% of the given height到工具栏..我假设你需要父布局的总高度(而不是子布局的高度) ),您需要执行以下两个选项:首先 Toolbar 必须是父布局ConstraintLayout的子布局,以约束其 17%。 second: 您的子布局不应该对父布局中的视图有任何约束。为了填充其父布局的整个区域,因此允许工具栏高度为 17%整个高度.. -
工具栏不能是父约束布局的子项,因为这会使
include标记过时。如果工具栏必须是父布局的子级,那么我如何才能包含它?那么你能否改变你的答案,应用你的答案并不能解决我的问题。其次,工具栏不应填充整个父级,而应仅填充其中的 0.17 个。当 recyclerview 不再显示时,我的工具栏填充整个视图的目的是什么? -
当然我会..但需要了解更多..现在您需要工具栏占父布局的 17%..您是否希望子布局具有相同的高度/宽度父母?
-
@Zain 我已经编辑了我的问题,希望可以理解。
-
感谢您编辑问题.. 在您的短语中“包含布局”是指
app_standard_checkout_btn还是引用它的布局?
标签: android android-layout android-view android-constraintlayout