android: 简单的 LinearLayout 和 fill_parent 问题
Posted
技术标签:
【中文标题】android: 简单的 LinearLayout 和 fill_parent 问题【英文标题】:android: simple LinearLayout and fill_parent question 【发布时间】:2010-12-29 19:49:47 【问题描述】:我确定我错过了一些简单的东西......
背景:
我是 android 和 UI 设计的新手,我只是想玩弄布局。现在我想在文本标签上堆叠一个复选框。我正在使用以下 xml 布局,工作正常:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical">
<CheckBox android:id="@+id/check_box"
android:layout_
android:layout_
android:text="@string/check_box_text" />
<TextView android:id="@+id/dummy_display"
android:layout_
android:layout_
android:text="@string/dummy_label" />
</LinearLayout>
我的测试(只是为了了解事情的运作方式):
场景 1) 当我将CheckBox
的layout_height
设置为"fill_parent"
时,CheckBox
占据整个屏幕并居中对齐(即-TextView
消失)。
场景 2) 如果我改为将TextView
的layout_height
设置为"fill_parent"
,CheckBox
确实不会消失。事实上,什么都没有消失,布局看起来和上面的 xml 一样,所有东西都被推到了左上角。
问题(和 cmets):
场景 1 是如何工作的?
这种行为对我来说似乎不一致。我认为fill_parent
只应该让元素填满父级中可用的任何空间。所以对我来说,似乎TextView
应该得到它需要的任何空间(因为它是wrap_content
),但CheckBox
应该占据其余的空间(所以@ 987654336@ 将被强制到屏幕底部,但不是不可见的)。换句话说...场景 2 对我来说有意义,但场景 1 没有。
请解释一下:-)。
谢谢,
汤姆
【问题讨论】:
您可能想阅读这篇文章(如果还没有的话):Android 如何绘制视图?链接:developer.android.com/guide/topics/ui/how-android-draws.html 【参考方案1】: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”何时/何地适合这个布局算法。你呢? 查看我的编辑以获取更多信息。这就是为什么我喜欢它总是有机会学习一些东西:) 如果我能给你一个以上的投票,我会的。这让我 NUTS 试图弄清楚如何让视图填满所有可用空间,让更多的空间流向一个而不是另一个。我使用的是相对布局的大杂烩,并没有走得太远。以上是关于android: 简单的 LinearLayout 和 fill_parent 问题的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何让LinearLayout的background在整个屏幕中心显示