第2节 LinearLayout
线性布局是安卓应用开发中最经常用到的布局之一。它能让放置与内部的控件或者子布局按照水平或竖直放置。
这里我们将介绍它最为常用的几个性质。
2.1 orientation属性
它可以让内部的控件或者子布局按照水平或者竖直方向,呈线性排列。设置android:orientation
为:
vertical
:按照竖直方向排列;horizontal
:安卓水平方向排列;
<LinearLayout
android:layout_width="match_parent"
android:layout_width="wrap_content"
<!--设置水平或者竖直的值-->
android:orientation="vertical">
......
</LinearLayout>
2.2 layout_weight属性
在LinearLayout包含的子布局(或者控件)中,使用这个属性,就能告诉LinearLayout,子布局(或者控件)的权重有多大,然后按照权重的比例将剩余的空间分配给它们。
举个例子:有个工地,长和宽都是100dp
,它用围墙围起来,里面竖着修房子。
- 第一间房要修
30dp
长,但是设置了layout_weight
为2
;第二间房要修20dp
长,但是设置了layout_weight
为1
;第三间要修10dp
长,但是设置了layout_weight
为1
。<LinearLayout android:layout_width="match_parent" android:layout_height="100dp" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="30dp" android:layout_weight="2"/> <TextView android:layout_width="match_parent" android:layout_height="20dp" android:layout_weight="1"/> <TextView android:layout_width="match_parent" android:layout_height="10dp" android:layout_weight="1"/> </LinearLayout>
因为每个房间都设置了高度,那么这个工地最后会被分割成
100 - 30 - 20 - 10
,还剩下40pd
的长度。因为都设置了
layout_weight
,那么这剩下的长度,将会被按照比例分配给它们。第一间房,额外分配 2/(2+1+1) * 40 = 20dp
第二间房,额外分配 1/(2+1+1) * 40 = 10dp
第三间房,额外分配 1/(2+1+1) * 40 = 10dp
最后就是,
第一间房 30+20 = 50dp;
第二间房 20+10 = 30dp;
第三间房 10+10 = 20dp;
- 如果我把每个房间的高度设置成
0dp
,layout_weight
都设置成1
,<LinearLayout android:layout_width="match_parent" android:layout_height="100dp" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout>
那么就剩下
100 - 0 - 0 - 0 = 100
的高度等待分配;第一间房,额外分配 1/(1+1+1) * 100 = 33dp
第二间房,额外分配 1/(1+1+1) * 100 = 33dp
第三间房,额外分配 1/(1+1+1) * 100 = 33dp
最后就是,
第一间房 0+33 = 33dp;
第二间房 0+33 = 33dp;
第三间房 0+33 = 33dp;
- 如果我把每个房间的高度设置成
match_parent
,layout_weight
设置成1
,<LinearLayout android:layout_width="match_parent" android:layout_height="100dp" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout>
那么就剩下
100 - 100 - 100 - 100 = -200
的高度等待分配;第一间房,额外分配 1/(1+1+1) * (-200) = -66dp
第二间房,额外分配 1/(1+1+1) * (-200) = -66dp
第三间房,额外分配 1/(1+1+1) * (-200) = -66dp
最后就是,
第一间房 100+(-66) = 33dp;
第二间房 100+(-66) = 33dp;
第三间房 100+(-66) = 33dp;
2.3 weightSum属性
这个属性用来控制各个子布局(或者控件)的权重之和。默认情况下,权重值为各个子控件的权重之和,但是如果设置了这个属性,那么就以这个设定的值为准,将父LinearLayout
设置android:weightSum
属性,值为2
。
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="vertical"
android:weightSum="2">
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
剩下的长度100dp
,将会被按照比例分配。
第一间房,额外分配 1/2 * 100 = 50dp(1/2是因为weightSum
被设置成了2)
因为只有一间房,所以剩下的空间不用分配了
最后就是,
第一间房 0+50 = 50dp;
还剩下50dp的空间不做任何分配;
weightSum
通常在布局占位的情况下使用。比如,LinearLayout
中,只包含一个TextView
控件,而又只希望TextView
只占用LinearLayout
上半空间,那么就可以这样设计,