对Android布局空间权重属性layout_weight的认识

**"weight"**顾名思义是权重的意思,layout_weight用于给一个线性布局中的诸多视图的重要程度赋值。所有的视图都有一个layout_weight值,默认为0,意思是需要显示多大的视图就占据多大的屏幕空间。

若赋一个高于零的值,则将父视图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight值以及该值在当前屏幕布局的整体layout_weight值和在其它视图屏幕布局的layout_weight值中所占的比率而定。举个例子:比如说我们在 水平方向上有一个文本标签和两个文本编辑元素。该文本标签并无指定layout_weight值,所以它将占据需要提供的最少空间。如果两个文本编辑元素每一个的layout_weight值都设置为1,则两者平分在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。如果两个文本编辑元素其中第一个的layout_weight值设置为1,而第二个的设置为2,则剩余空间的三分之二分给第一个,三分之一分给第二个(数值越小,重要度越高)。

虽然是根据比例来分配剩余的空间,但是如果layout_weight在某些情况下取值不当,可能会出现子视图不能填满父视图的情况,典型的案例就是父视图背景为白色,垂直布局,子视图subview1和subview2的layout_weight分别为6、0.8,背景颜色分别为不同程度的灰色(便于区分),subview1在subview2的上方,你会发现在subview2的下方有很细的白色缝隙。

为什么会造成这样的情况,?

我们知道6比0.8其实就是15比2,当我将子视图subview1和subview2的layout_weight分别重新设置为15、2的时候,缝隙没有了。

似乎weight的值不能为小数,我没有验证过,但是因为我曾遇到过两次这样的情况,我建议不要将layout_weight设为小数,且当layout_weight引起布局异常的时候,换成同样的比值的不同数值试试。

我认为这是android的一个bug,很明显layout_weight的底层实现里面,在某些情况下会造成值的丢弃。而google官方似乎并没有做说明。