安卓:简单的LinearLayout和fill_parent问题

6

我相信我错过了一些简单的东西...

背景:

我是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)当我将CheckBoxlayout_height设置为"fill_parent"时,CheckBox占据整个屏幕并居中对齐(即- TextView消失)。

  • 场景2)如果我相反地TextViewlayout_height设置为"fill_parent"CheckBox不会消失。实际上,没有任何东西消失,布局与上面的xml文件相同,其中所有内容都被推到左上角。

问题(和评论):

为什么场景1的工作方式是这样的?

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

请解释一下 :-)。

谢谢,

汤姆


你可能想阅读一下(如果还没有):Android如何绘制视图?链接:http://developer.android.com/guide/topics/ui/how-android-draws.html - Samuh
1个回答

13
LinearLayout 逐一测量其子项,所以在你的第一个例子中,它看到第一个子项想要使用所有可用高度,就会给予它。在第二个例子中,它将所有可用空间给予了第二个子项。如果你想让复选框占据除文本框所需空间之外的所有空间,你应该将复选框的 layout_height 改为 wrap_parent 并设置每个子项的 layout_weight 属性,布局权重表示在所有子项测量后可用空间的比例。更具体地说,它的工作流程如下:
1)LinearLayout 的父级告诉线性布局可以有多大
2)LinearLayout 按照指定顺序询问所有子项的布局参数,并分配可用空间。
3)如果仍有剩余空间,则根据它们的权重将其分配给子项(布局权重介于0和1之间,0是默认值)。
希望能对你有所帮助
编辑:
我已经检查了 LinearLayout 的源代码,并发现如果一个线性布局具有 FILL_PARENT 布局参数且没有零权重,则测量代码将把布局高度设置为 WRAP_CONTENT,然后根据权重在所有子项之间分配空间。

嗯,这似乎不完全正确,但你很接近了。当我将复选框的权重设置为1时...但保持高度为fill_parent...它按预期工作。也就是说...渲染器不会在看到高度为fill_parent时仅给复选框所有空间。所以你所说的关于权重的一切对我来说都是有道理的...但我不知道“fill_parent”何时/何处适用于此布局算法。你呢? - Tom
这就是为什么我喜欢 Stack Overflow,它总是给我学习的机会 :) - Nikolay Ivanov
如果我可以给你超过一个赞,我会的。试图弄清楚如何让视图填充所有可用空间,其中一个比另一个获得更多空间,这让我疯狂。我一直在使用各种相对布局,但进展不大。 - I82Much

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接