【1】《50 Android Hacks(安卓五十技)》翻译——三顾频烦天下技
然而这书已经有了地球人翻译的版本。
http://item.jd.com/11431447.html
地球人可以看这个。
第一章 搞一搞布局
第一技 使用权重(weight)居中控件(View) [Android 1.6+]
有一回我去参加谷歌开发者大会,我在讲怎么用XML创建控件的时候有个人插嘴,说“我要是想让一个控件居中而且宽度是父控件的一半该怎么写?”我一开始没听懂他说的什么玩意,不过他后来跑上来在黑板上画了图我就懂了。见图一和图二。
·图一 按钮宽度占父布局一半(纵向)
·图二 按钮宽度占父布局一半(横向)
看起来是不是特别简单?有种你试试再说。在这一技里,我就来教教你怎么做人用线性布局(LinearLayout)里的android:weightSum属性加上子控件的android:layout_weight属性来解决这个问题。这任务看起来挺简单的,但是我经常在跟弱者开发者聊天的时候问起这个问题,因为很多人都不知道最好的解决方法。
1.1 我来组成权重和(weightSum)和布局权重(layout_weight)
Android设备有各种大小,作为开发者你就得写XML来应对各种大小。硬编码尺寸值并不可取,所以我们得想点别的招来组织控件。
重要的事情说到了第三遍,我们要用权重和以及布局权重来把我们的布局里剩下的空间塞满。android:weightSum的API文档(详见我不一定能翻译到的1.3章)描述了一个跟我们想做的差不多的场景:
定义最大权重和。如果没有指定,权重和就由所有子控件的layout_weight相加得到。如果想让单个子控件得到所有可用空间的一半,可以通过把它的layout_weight设为0.5,然后把weightSum设为1.0来实现。
就像是我们要把小○○塞入一个小○里一样。weightSum就是可用空间的百分比,而layout_weight就是小○里的每个小○○能占的百分比。假设小红的小○的weightSum是1,里面放了两个小○○,分别是小明的小○○和小刚的小○○。小明的小○○的layout_weight是0.25,小刚的小○○则是0.75,于是小明的小○○就占有了小红的小○25%的空间,而小刚的小○○就占据了剩下的75%。
本章开头的那个情况的解决办法也是差不多的。给父布局一个指定的weightSum,再把按钮的android:layout_weight指定成它一半的值。关门放XML:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:background="#FFFFFF" 6 android:gravity="center" 7 android:orientation="horizontal" 8 android:weightSum="1" > 9 10 <Button 11 android:layout_width="0dp" 12 android:layout_height="wrap_content" 13 android:layout_weight="0.5" 14 android:text="Click me" /> 15 16 </LinearLayout>
线性布局读到了android:weightSum,就知道了它所有子控件权重的和是1。又因为它第一个也是唯一一个子控件,按钮,的android:layout_width设成了0dp,线性布局就知道了它得用android:weightSum给的值来决定这个按钮的宽度。然后又因为按钮的android:layout_weight设成的0.5,于是它就正好占了所有可用空间的一半。
比如线性布局的宽度是200dp,android:weightSum是1。按钮的实际宽度就是这么算的:
按钮的指定宽度 + 按钮的权重 * 200 / 权重和
∵按钮的指定宽度 = 0(dp)
又∵按钮的权重 = 0.5
∴按钮的实际宽度 = 0 + 0.5 * 200 / 1 = 100(dp)
1.2 The bottom line 怎么翻译比较好,在线等,挺急的。
如果想基于百分比给线性布局分配可用空间,权重还是挺重要的,反正比硬编码强。如果你在3.0以上搞开发而且用过Fragment,你可能发现大部分示例代码都是用权重来把不同的Fragment放到布局里的。学会用权重也算是get√了个新技能。
1.3 外部链接
http://developer.android.com/reference/android/widget/LinearLayout.html