FrameLayout 高度与父级不匹配
Posted
技术标签:
【中文标题】FrameLayout 高度与父级不匹配【英文标题】:FrameLayout height not matching parent 【发布时间】:2017-05-25 21:53:13 【问题描述】:我在 AlertDialog 中有以下布局作为自定义视图。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:layout_gravity="center"
android:gravity="center"
android:padding="16dp">
<LinearLayout
android:layout_
android:layout_
android:layout_gravity="center"
android:orientation="vertical">
<GridLayout
android:layout_
android:layout_
android:layout_gravity="center"
android:columnCount="3">
<TextView
android:id="@+id/code1"
android:layout_
android:layout_
android:gravity="center"
android:text="\u2022"
android:textSize="@dimen/match_code_digit_size"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/code2"
android:layout_
android:layout_
android:layout_marginBottom="20dp"
android:gravity="center"
android:text="\u2022"
android:textSize="@dimen/match_code_digit_size"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/code3"
android:layout_
android:layout_
android:gravity="center"
android:text="\u2022"
android:textSize="@dimen/match_code_digit_size"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k1"
android:layout_
android:layout_
android:text="1"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k2"
android:layout_
android:layout_
android:text="2"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k3"
android:layout_
android:layout_
android:text="3"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k4"
android:layout_
android:layout_
android:text="4"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k5"
android:layout_
android:layout_
android:text="5"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k6"
android:layout_
android:layout_
android:text="6"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k7"
android:layout_
android:layout_
android:text="7"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k8"
android:layout_
android:layout_
android:text="8"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k9"
android:layout_
android:layout_
android:text="9"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/k0"
android:layout_
android:layout_
android:layout_column="1"
android:text="0"
android:textSize="@dimen/match_code_button_text"
tools:ignore="HardcodedText" />
</GridLayout>
<TextView
android:id="@+id/error"
style="@style/ErrorText"
android:layout_
android:layout_
android:layout_gravity="center"
android:gravity="center"
android:text="@string/match_error"
android:visibility="invisible" />
</LinearLayout>
<FrameLayout
android:id="@+id/progress"
android:layout_
android:layout_
android:background="#80ffffff"
android:visibility="visible">
<ProgressBar
android:layout_
android:layout_
android:layout_gravity="center" />
</FrameLayout>
</FrameLayout>
抱歉,排版量大,按原样放在这里。
注意底部的带有 progress 的 FrameLayout。尽管它有 android:layout_,但在设备上它看起来像“wrap_content” - 高度只匹配内部 ProgressBar。 尽管在 Android Studio 设计器中完美展示,占据了整个视图。
怎么了?
这是 AS 设计器中的布局外观
在设备上(模拟器和真机都试过,效果一样)
【问题讨论】:
你能把图片和预期的输出也发一下吗 为您的子框架布局添加重力 @Alexey 检查我的答案 @Alexey 我的回答肯定会有所帮助! 【参考方案1】:尝试将根FrameLayout改为RelativeLayout
【讨论】:
【参考方案2】:您有两个 FrameLayout。 @id progress 一个和一个LinearLayout
一个。
首先快速浏览一下developer.android.com
FrameLayout 的设计目的是在屏幕上屏蔽一个区域以显示 单个项目。一般情况下,应该使用 FrameLayout 来容纳单个 子视图,因为在一个子视图中组织子视图可能很困难 在没有孩子的情况下可扩展到不同屏幕尺寸的方式 相互重叠。
那么对于你的父母FrameLayout
你有几个孩子?(2)
但是,您可以向 FrameLayout 和控件添加多个子项 它们在 FrameLayout 中的位置通过将重力分配给每个 孩子,使用 android:layout_gravity 属性。
你的两个孩子都有重力吗?不,不是为了@id 进度
子视图绘制在堆栈中,最近添加的子视图 在上面。 FrameLayout 的大小是其最大子项的大小 (加上填充),可见与否(如果 FrameLayout 的父级允许)。
所以首先你添加线性布局,然后你添加 FrameLayout 所以.. child FrameLayout
应该在顶部,它是。那是你的问题吗?
即使你的布局很长,也可以缩短到这个
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:layout_gravity="center"
android:gravity="center"
android:padding="16dp">
<LinearLayout
android:layout_
android:layout_
android:layout_gravity="center"
android:background="#121"
android:orientation="vertical">
</LinearLayout>
<FrameLayout
android:id="@+id/progress"
android:layout_
android:layout_
android:layout_gravity="center"
android:background="#567"
android:visibility="visible">
<ProgressBar
android:layout_
android:layout_
android:layout_gravity="center" />
</FrameLayout>
</FrameLayout>
输出(我为您的 child 框架布局中缺少 gravity 的线性布局添加了图像):
【讨论】:
【参考方案3】:我遇到了同样的问题并设法解决了它。似乎没有人注意到这一点,但问题的根源是GridLayout
。正如您在蓝图中看到的那样,FrameLayout
没有问题,因为它确实与父级匹配。 GridLayout
的项目具有固定大小,这是错误的。您需要为GridLayout
中的每个项目设置权重,以便项目可以拉伸以适应任何屏幕分辨率。但是GridLayout
中的权重需要 API 21。所以我建议您使用嵌套的 LinearLayout's
并将项目的权重设置为 1。
【讨论】:
不,已经尝试过使用一组 LinearLayout 而不是 GridLayout - 同样的问题 :( 你将物品的宽度和高度设置为固定还是带权重? 我想说的是你不应该使用dimen
文件夹中的尺寸。【参考方案4】:
我在项目中遇到的问题是,我有两个具有相同 ID 的 Frame 布局。 解决方案是为框架布局分配唯一的 ID。
希望这对未来的读者有所帮助。
【讨论】:
以上是关于FrameLayout 高度与父级不匹配的主要内容,如果未能解决你的问题,请参考以下文章
Android子视图高度与ListView项目中的父级不匹配
ListView布局高度与Fragment中的RecyclerView内的父级不匹配