剩余空间(注意,所谓剩余空间,参看下面的示例)。权重值是一个整数,各个子元素根据权重值按比例分配父元素的剩余空间。默认的权重值为0,表示子元素仅占用适合于该子元素内容的空间。
LinearLayout.weight表示元素额外空间的大小。如果无需拉伸,设置为0。
a、b、c,宽度分别为Sa、Sb、Sc,layout_weight分别为Wa、Wb、Wc;总宽度为S。则:被a、b、c分配的剩余空间为Sr=S-Sa-Sb-Sc;分配给它们的额外空间分别为:Ea=Sr*Wa/(Wa+Wb+Wc)、Eb=Sr*Wb/(Wa+Wb+Wc)、Ec=Sr*Wc/(Wa+Wb+Wc);它们的最终大小分别为:Fa=Sa+Ea、Fb=Sb+Eb、Fc=Sc+Ec。
注意,即使Sr小于0,仍然会发生额外空间的分配!
10、20、30,layout_weight分别为3、2、1;总宽度为150。则:被三个按钮分配的剩余空间为150-10-20-30=90;分配给它们的额外空间分别为:90*3/(3+2+1)=45、90*2/(3+2+1)=30、90*1/(3+2+1)=15;它们的最终大小分别为:10+45=55、20+30=50、30+15=45。
如果想让三个按钮最终大小比例为3:2:1,则应当设置原始宽度为0。
网上有一些对权重的解释,不少都是错误的,下面对其中的某篇给出正确的解释(具体来源就不说了):
布局文件如下:
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<Buttonandroid:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_weight="1" android:text="Button1" />
<Buttonandroid:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_weight="2" android:text="Button2" />
</LinearLayout>
Button1的layout_weight=1,Buttong2的layout_weight=2,运行效果为:
我们看到,Button1占了2/3,Button2占了1/3。如果此时把button2的weight设置成2000,不是说Button2就消失了,而是Button1的宽度几乎占满了屏幕宽度,而屏幕最后一丝细条则是留给Button2的,已近非常小了,没有显示出来。截图如下:
得出结论:在layout_width设置为fill_parent的时候,layout_weight代表的是你的控件要优先尽可能的大,但尽可能大是有限度的,即fill_parent。
……
当然,上面的结论是错误的。
对于Button1和Button2,它们的layout_width都是fill_parent(顺便说一句,现在该值已被match_parent替代),也就是说,它们的原始宽度就是整个父容器的宽度(下面以屏幕替代)。在默认情况下,既然Button1占满了整个屏幕,Button2将不会被显示。但是,因为设置了Button1和Button2的layout_weight属性,且不会0,因此需要进行额外空间的计算。此时,额外空间是一个负值,大小恰好是整个屏幕的宽度。
Sbutton1=屏幕宽度
Sbutton2=屏幕宽度
Sr=屏幕宽度-Sbutton1- Sbutton2=-屏幕宽度(注意负号)
layout_weight_Button1=1
layout_weight_Button2=2
Ebutton1= Sr*1/(1+2)=负三分之一屏幕宽度
Ebutton1= Sr*2/(1+2)=负三分之二屏幕宽度
最终宽度:
Fbutton1=Sbutton1+Ebutton1=屏幕宽度+负三分之一屏幕宽度=三分之二屏幕宽度
Fbutton2=Sbutton2+Ebutton2=屏幕宽度+负三分之二屏幕宽度=三分之一屏幕宽度
Fbutton1和Fbutton2的比例恰好是layout_weight属性值的反比,只是一个巧合。