android:简单的LinearLayout和fill_parent问题

时间:2009-12-24 13:48:27

标签: xml android layout user-interface

我确定我错过了一些简单的事情......

背景

我是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}}设置为TextViewlayout_height消失。实际上,没有什么消失,并且布局看起来与上面的xml相同,其中所有内容都被推到左上角。

问题(及评论):

方案1的运作方式如何?

这种行为对我来说似乎不一致。我认为"fill_parent"只应该让元素填满父级中可用的空间。所以对我来说,似乎CheckBox应该得到需要的任何空间(因为它是fill_parent),但是TextView应该占用其余的空间(因此wrap_content将被强制到屏幕的底部,但不是不可见的)。换句话说......场景2对我有意义,但场景1没有。

请解释: - )。

谢谢,

汤姆

1 个答案:

答案 0 :(得分:13)

LinearLayout将孩子作为一个接一个的步骤来衡量,所以在你的第一个例子中 它看到第一个孩子想要拥有所有可用的高度。 在您的第二个示例中,它为第二个孩子提供了所有可用的位置。 如果您希望复选框占据文本框所需的所有位置,则应更改 layout_height为wrap_parent的复选框并设置每个孩子的layout_weight属性,布局权重表示之后所有孩子的测量值应添加到每个孩子的位置。更具体地说明它按步骤工作的方式:
1)LinearLayout的父级告诉线性布局它有多大 2)LinearLayout要求所有孩子按顺序指定他们的布局参数并分配可用空间 3)如果任何可用空间仍然可用,则根据其重量在子节点之间分配(布局重量在0和1,0之间 - 默认情况下)
希望它有所帮助 修改
我检查了LinearLayout源代码并发现如果线性布局有FILL_PARENT布局参数而不是零重量测量代码将布局高度设置为WRAP_CONTENT然后在所有之间分配空间根据体重的孩子。