我确定我错过了一些简单的事情......
背景
我是Android和UI设计的新手,我只想玩布局。现在我想在文本标签的顶部堆叠一个复选框。我使用以下xml布局正常工作:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<CheckBox android:id="@+id/check_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/check_box_text" />
<TextView android:id="@+id/dummy_display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dummy_label" />
</LinearLayout>
我的测试(只是为了了解事情是如何运作的):
场景1)当我将CheckBox
的{{1}}设置为layout_height
时,"fill_parent"
会占据整个屏幕并与中心对齐(即 - CheckBox
消失了。
场景2)如果我而将TextView
的{{1}}设置为TextView
,layout_height
会不消失。实际上,没有什么消失,并且布局看起来与上面的xml相同,其中所有内容都被推到左上角。
问题(及评论):
方案1的运作方式如何?
这种行为对我来说似乎不一致。我认为"fill_parent"
只应该让元素填满父级中可用的空间。所以对我来说,似乎CheckBox
应该得到需要的任何空间(因为它是fill_parent
),但是TextView
应该占用其余的空间(因此wrap_content
将被强制到屏幕的底部,但不是不可见的)。换句话说......场景2对我有意义,但场景1没有。
请解释: - )。
谢谢,
汤姆
答案 0 :(得分:13)
LinearLayout
将孩子作为一个接一个的步骤来衡量,所以在你的第一个例子中
它看到第一个孩子想要拥有所有可用的高度。
在您的第二个示例中,它为第二个孩子提供了所有可用的位置。
如果您希望复选框占据文本框所需的所有位置,则应更改
layout_height为wrap_parent
的复选框并设置每个孩子的layout_weight
属性,布局权重表示之后所有孩子的测量值应添加到每个孩子的位置。更具体地说明它按步骤工作的方式:
1)LinearLayout的父级告诉线性布局它有多大
2)LinearLayout要求所有孩子按顺序指定他们的布局参数并分配可用空间
3)如果任何可用空间仍然可用,则根据其重量在子节点之间分配(布局重量在0和1,0之间 - 默认情况下)
希望它有所帮助
修改强>
我检查了LinearLayout
源代码并发现如果线性布局有FILL_PARENT
布局参数而不是零重量测量代码将布局高度设置为WRAP_CONTENT
然后在所有之间分配空间根据体重的孩子。