【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

原文地址:https://www.cnblogs.com/chihane/p/4450564.html