Android技巧1—使用weights来居中views
适合于Android v1.6以上
在我给一群开发者做演讲的时候,我正解释如何使用XML来创建视图(view),有人就问我说:“我想将一个按钮居中并且它的宽度是父元素宽度的一半,我该怎么写?“。一开始我还没明白他的意思,他画出来以后我就懂了。他的意思就是如图1.1和1.2所示那样。
看起来很简单,对吧?现在请用5分钟来试着实现它吧。这里讲的技巧里,我们将学到如何使用线性布局(LinearLayout)的android:weightSum属性结合它的子属性android:layout_weight来解决这个问题。这看起来可能是个简单的任务,但这是我在招聘开发人员时经常问的问题之一,因为很多人都不知道解决这个问题的最好方法是什么。
同时使用weightSum和layout_weight
安卓设备拥有不同的尺寸,作为开发者的我们需要使我们创建的XML在不同尺寸的屏幕上正常工作。硬编码不是我们的选择,我们需要别的方法来布局视图。
我们将使用layout_weight和weightSum属性将布局剩余的的空间填满。android:weightSum的文档(见1.3部分)描述了一个类似我们正在试着完成的方案。
指定weight的最大总值。如果没指定,则总值就是所有子元素的layout_weight之和。这样的话就可以指定一个子元素占总可用空间的50%,如指定它的layout_weight为0.5,并且指定weightSum为1.0。
好比我们需要将东西放进一个盒子。整个盒子的空间就是weightSum,而layout_weight就是每个东西所占整个空间的百分比。例如,盒子的总空间weightSum为1,现在要放东西A和东西B进去,将A的layout_weight设置为0.25,同时将B的layout_weight设置为0.75,这样东西就会占用整个盒子空间的25%,而B占用75%。
我们将父元素的weightSum设置为一个指定的值,并且把这个值的一半指定给按钮的android:layout_weight属性。结果XML文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:gravity="center" android:weightSum="1" > ①
<Button android:layout_width="0dp" ② android:layout_height="wrap_content" android:layout_weight="0.5" ③ android:text="Click me" />
</LinearLayout> |
线性布局(Linearlayout)读取到android:weightSum属性,并且知道所有子元素的weight之和为1。线性布局的第一个也是唯一的一个子元素Button的android:layout_weigth属性值设置为0dp,这就告诉线性布局根据可用空间也就是android:weightSum所指定的空间来决定按钮的宽度。因为按钮的android:layout_weight属性值为0.5,因此它将占据可用空间的50%。
这里有个合适的例子,线性布局(LinearLayout)的宽为200dp,指定它的android:weightSum属性值为1。那么,按钮(Button)的宽度可以这样计算:
按钮的宽 + 按钮的weight值 * 200 / sum(weight)
因为按钮的宽为0dp,它的weight为0.5。sum(weight)是1,结果如下所示:
0+ 0.5 * 200 / 1 = 100
结果
使用线性布局(LinearLayout)的weight是很重要的,特别是当你想根据百分比来分配可用空间而不是写死尺寸的时候。如果你的目标平台是Honeycomb,并且使用了碎片(Fragments),你将会注意到很多例子在布局里放置不同的碎片(Fragments)时使用了权重(weight)。所以,明白如何使用权重(weight)将会使你如虎添翼。
外部链接
http://developer.android.com/reference/android/widget/LinearLayout.html