我有一个XML布局,我在LinearLayout中嵌套了FrameLayout,并尝试在FrameLayout的顶部堆叠一个兄弟查看组。它根本不显示兄弟查看组,而只显示FrameLayout。我想请一些帮助来理解为什么将根ViewGroup替换为RelativeLayout会产生预期的输出。
这是布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mainFrameLayout"
android:background="#787878"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/ImageView01"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:src="@drawable/download"
android:adjustViewBounds="true"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="40sp"
android:text="Top text" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:gravity="right"
android:text="bottom_text"
android:textColor="#fff"
android:textSize="50sp" />
</LinearLayout>
</LinearLayout>
我只看到FrameLayout本身填满了屏幕。当我将根ViewGroup更改为使用layout_height和layout_width定义为“match_parent”的RelativeLayout时,我得到了我的预期输出,其中ImageView和两个TextView都显示在FrameLayout之上。我很困惑如何使它工作,因为我没有为子ViewGroups / View指定任何RelativeLayout参数,如“bottomof”或“topof”。
RelativeLayout是否有调整大小或重量分布,而LinearLayout没有?我一直在网上看,但遗憾的是没有找到答案。
谢谢!
答案 0 :(得分:4)
在您显示的代码中,第一个FrameLayout
与父级的高度匹配,因此后面的LinearLayout
被推到屏幕下方(y轴,而不是z轴)FrameLayout
。这是因为他们的父母是LinearLayout
,它将孩子的一个在另一个下面垂直排列(y轴),不重叠(如在一卷卫生纸上,每个视图都是纸方)。
如果您希望孩子FrameLayout
和LinearLayout
位于另一个(z轴)的顶部,则他们的父母必须是FrameLayout
,这会将其安排在其中另一个在z轴上重叠(如在一叠纸张中)。
至于为什么没有指定布局参数的RelativeLayout
给出了您预期的行为,这是因为默认情况下将子视图放在容器的左上角角落(来自{{ 3}}):
默认情况下,所有子视图都在布局的左上角绘制,因此您必须使用RelativeLayout.LayoutParams中提供的各种布局属性来定义每个视图的位置。
答案 1 :(得分:0)
您应该从FrameLayout中删除match_parent,因为垂直方向的Linearlayout会一个接一个地放置视图。
在您的情况下,FrameLayout负责获取整个设备屏幕,因此剩余视图将被推送到屏幕外。