android:简单的LinearLayout和fill_parent问题

Tom*_*Tom 6 xml layout user-interface android

我确定我错过了一些简单的东西......

背景:

我是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>
Run Code Online (Sandbox Code Playgroud)

我的测试(只是为了了解事情的运作方式):

  • 场景1)当我设置CheckBox's layout_height"fill_parent",CheckBox占据整个屏幕并且对齐中心(即 - TextView消失).

  • 场景2)如果我 改为TextView's 设置layout_height"fill_parent",CheckBox不会消失.事实上,没有什么消失,并且布局看起来与上面的xml相同,其中所有内容都被推到左上角.

问题(及评论):

方案1的工作方式如何?

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

请解释 :-).

谢谢,

汤姆

Nik*_*nov 13

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