Layout_weight是一个很重要的属性,分配权重,当然说的是线性布局的时候,也就是使用LinearLayout的时候。
什么时候使用Layout_weight呢,简单的说当你无法用match_parent 、wrap_content、直接分配固定值的时候。
需要按比例显示 1:1:1 这样显示按钮。当然这种需求的时候 你也可以直接使用GridLayout。
但是直接使用layout_weight 这个属性 会使这个功能更容易实现。
layout:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="button01"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="button02"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="button03"
/>
</LinearLayout>
显示效果:
现在我把权重设为1:2:3
显示效果:
感觉跟刚才好像差不多吧。
那么我们先不要设权重 试试,也就是每个button都充满内容,不设权重其实也就是权重为0。
显示效果:
剩下的只有一点点空间。
根据上面3个例子。下面开始讲下是如何根据权重分配空间的。首先分配空间不是根据你当前父控件的空间来分配的。而是父控件的剩余空间来分配的。
按我们第三个例子来说,不是以3个button所在的LinearLayout的总宽度来根据权重分配,而是以LinearLayout在分配完三个按钮的宽度后所剩下的宽度再按权重去分配,这里有点需要说明的是 剩余空间允许是负数,比如LinearLayout给3个按钮分配后超出了自己本身的宽度,那么剩余空间就是负数。
这么一说,第二个例子的形成的原因就好理解了。LinearLayout先给3个button分配wrap_content的空间,然后剩下的空间按1:2:3分配给3个按钮。
下面我们再看一个例子,把wrap_content 全部改为match_parent
权重:0:0:0
显示效果:
另外2个直接被挤到外面去了。
1:1:1
显示效果:
1:2:1
显示效果:
Button2直接消失了,真是奇怪。
下面来分析下:
前面已经说了剩余空间有可能是负的。
下面来计算下。
LinearLayout先给3个button分配空间,3个都是match_parent,那么就是3*parent_with;
那么剩余空间就是parent_width-3*parent_width=-2*parent_width;
然后根据权重分配,并分别让3个按钮加上分配到的宽度。
所以
Button1_width=parent_width+(1/4)*-2*parent_width=1/2*parent_width;
Button3_width=parent_width+(1/4)*-2*parent_width=1/2*parent_width;
Button2_width=parent_width+(1/2)*-2*parent_width=0;。
这样大家可能就会觉得这样分配感觉很麻烦,好像还要自己计算。
其实大可不必如此,既然你使用layout_weight就是想按比例显示,那么你直接让所有的
View的layout_width都为固定值0,那么剩余空间就是LinearLayout的宽度,然后再按权重分配,就不用考虑剩余空间的问题。
该贴被java_along编辑于2014-7-30 21:25:25该贴被java_along编辑于2014-7-30 21:26:33