LinearLayout布局時(shí)有三種屬性可能會(huì)經(jīng)常遇到,并且還是不好理解的,所以特意拿出來說一下。
1.gravity
1.1 gravity
gravity屬性是view本身內(nèi)容的位置。
例如,TextView的text,Button的text等。
1.2 屬性值
- 上下左右。
| 屬性值 | 效果 |
|---|---|
| top | 將對(duì)象放在其容器的頂部,不改變其大小. |
| bottom | 將對(duì)象放在其容器的底部,不改變其大小. |
| left | 將對(duì)象放在其容器的左側(cè),不改變其大小. |
| right | 將對(duì)象放在其容器的右側(cè),不改變其大小. |
| start | 是為了兼容從左到右和從右到左的不同書寫順序的 |
| end | 是為了兼容從左到右和從右到左的不同書寫順序的 |
- 縱橫
| 屬性值 | 效果 |
|---|---|
| center_vertical | 將對(duì)象縱向居中,不改變其大小。 |
| fill_vertical | 如果需要時(shí),將對(duì)象縱向填充 |
| center_horizontal | 將對(duì)象橫向居中,不改變其大小 |
| fill_horizontal | 如果需要時(shí),將對(duì)象橫向填充 |
| center | 將對(duì)象居中,不改變其大小 |
| fill | 將對(duì)象橫向和縱向填充 |
- 附加選項(xiàng)
| 屬性值 | 效果 |
|---|---|
| clip_vertical | 附加選項(xiàng),用于按照容器的邊來剪切對(duì)象的頂部和/或底部的內(nèi)容. 剪切基于其縱向?qū)R設(shè)置:頂部對(duì)齊時(shí),剪切底部;底部對(duì)齊時(shí)剪切頂部;除此之外剪切頂部和底部.垂直方向裁剪 |
| clip_horizontal | 附加選項(xiàng),用于按照容器的邊來剪切對(duì)象的左側(cè)和/或右側(cè)的內(nèi)容. 剪切基于其橫向?qū)R設(shè)置:左側(cè)對(duì)齊時(shí),剪切右側(cè);右側(cè)對(duì)齊時(shí)剪切左側(cè);除此之外剪切左側(cè)和右側(cè).水平方向裁剪 |
注意
- 使用LinearLayout的時(shí)候需要注意:縱只能用橫,橫只能用縱。
android:orientation="vertical"只有水平方向的屬性起作用,比如:left,right,center_horizontal。
android:orientation=“horizontal”只有垂直方向的屬性起作用,比如:top,bottom,center_vertical。
是因?yàn)橐呀?jīng)定義過縱橫了,再次定義將無效化。
下面是例子:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#B2EBF2">
<TextView
android:layout_width="300dp"
android:layout_height="50dp"
android:background="#4db6ac"
android:layout_gravity="right"
android:layout_marginTop="1dp"
android:text="right"
android:textSize="40sp" />
<TextView
android:layout_width="310dp"
android:layout_height="50dp"
android:background="#4db6ac"
android:layout_gravity="center_horizontal"
android:layout_marginTop="1dp"
android:text="center_horizontal"
android:textSize="40sp" />
<TextView
android:layout_width="300dp"
android:layout_height="50dp"
android:background="#4db6ac"
android:layout_gravity="center_vertical"
android:layout_marginTop="1dp"
android:text="center_vertical"
android:textSize="40sp" />
<TextView
android:layout_width="300dp"
android:layout_height="50dp"
android:background="#4db6ac"
android:layout_gravity="fill_horizontal"
android:layout_marginTop="1dp"
android:text="fill_horizontal"
android:textSize="40sp" />
<TextView
android:layout_width="300dp"
android:layout_height="50dp"
android:background="#4db6ac"
android:layout_gravity="clip_horizontal"
android:layout_marginTop="1dp"
android:text="clip_horizontal"
android:textSize="40sp" />
</LinearLayout>
2.1 layout_gravity
細(xì)心的你發(fā)現(xiàn)了,與前一個(gè)十分相似。它們的區(qū)別是:
- android:gravity是自己內(nèi)部的子元素
- android:layout_gravity是控制自己在父元素的位置。
1.2 屬性
屬性一毛一樣。。
- 上下左右。
| 屬性值 | 效果 |
|---|---|
| top | 將對(duì)象放在其容器的頂部,不改變其大小. |
| bottom | 將對(duì)象放在其容器的底部,不改變其大小. |
| left | 將對(duì)象放在其容器的左側(cè),不改變其大小. |
| right | 將對(duì)象放在其容器的右側(cè),不改變其大小. |
- 縱橫
| 屬性值 | 效果 |
|---|---|
| center_vertical | 將對(duì)象縱向居中,不改變其大小。 |
| fill_vertical | 將對(duì)象縱向填充 |
| center_horizontal | 將對(duì)象橫向居中,不改變其大小 |
| fill_horizontal | 將對(duì)象橫向填充 |
| center | 將對(duì)象居中,不改變其大小 |
| fill | 將對(duì)象橫向和縱向填充 |
- 附加選項(xiàng)
| 屬性值 | 效果 |
|---|---|
| clip_vertical | 附加選項(xiàng),用于按照容器的邊來剪切對(duì)象的頂部和/或底部的內(nèi)容. 剪切基于其縱向?qū)R設(shè)置:頂部對(duì)齊時(shí),剪切底部;底部對(duì)齊時(shí)剪切頂部;除此之外剪切頂部和底部.垂直方向裁剪 |
| clip_horizontal | 附加選項(xiàng),用于按照容器的邊來剪切對(duì)象的左側(cè)和/或右側(cè)的內(nèi)容. 剪切基于其橫向?qū)R設(shè)置:左側(cè)對(duì)齊時(shí),剪切右側(cè);右側(cè)對(duì)齊時(shí)剪切左側(cè);除此之外剪切左側(cè)和右側(cè).水平方向裁剪 |
注意
- 使用LinearLayout的時(shí)候需要注意:縱只能用橫,橫只能用縱。
android:orientation="vertical"只有水平方向的屬性起作用,比如:left,right,center_horizontal。
android:orientation=“horizontal”只有垂直方向的屬性起作用,比如:top,bottom,center_vertical。
是因?yàn)橐呀?jīng)定義過縱橫了,再次定義將無效化。
下面是例子:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="1dp"
android:background="#4db6ac"
android:gravity="top"
android:text="abca"
android:textSize="40sp" />
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="1dp"
android:background="#4db6ac"
android:gravity="bottom"
android:text="abca"
android:textSize="40sp" />
<TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_marginTop="1dp"
android:background="#4db6ac"
android:gravity="right"
android:text="1"
android:textSize="40sp" />
<TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_marginTop="1dp"
android:background="#4db6ac"
android:gravity="center_horizontal"
android:text="1"
android:textSize="40sp" />
<TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_marginTop="1dp"
android:background="#4db6ac"
android:gravity="fill"
android:text="a"
android:textSize="40sp" />
</LinearLayout>
3.layout_weight
這個(gè)屬性在LinearLayout的復(fù)雜布局時(shí)可能會(huì)出現(xiàn),但是大家好像都講的不是很清楚。在此詳細(xì)講講。
首先,這個(gè)屬性是權(quán)重的意思。
比如這樣

兩個(gè)控件都是1:1,此時(shí)不用考慮怎么去設(shè)置具體數(shù)值值讓他們平分,只需要設(shè)置兩個(gè)控件android:layout_weight="1"就行了。
但是會(huì)有一些問題,一般都是Layout_width設(shè)置的問題:
-
match_parent和wrap_content顯示問題。
當(dāng)設(shè)置該屬性的控件的layout_width="warp_content",很正確.
但是當(dāng)該屬性的控件的layout_width="match_parent"的時(shí)候,同樣的代碼就變成了這樣。
這是為什么呢?
是因?yàn)閘ayout_weight的屬性是這樣計(jì)算的:
自身長度+(子權(quán)重/子權(quán)重之和)剩余空間*
當(dāng)為wrap_content的時(shí)候,計(jì)算時(shí)自身長度為0,剩余空間就是match_parent,自然就是正確的比重了。
當(dāng)為match_parent的時(shí)候,計(jì)算時(shí)自身長度為match_parent,剩余空間為match_parent-(控件個(gè)數(shù))3*match_parent=-2match_parent。那么三個(gè)的占比就為:
- match_parent+(1/6)*-2match_parent=4/6match_parent
- match_parent+(2/6)*-2match_parent=2/6match_parent
- match_parent+(3/6)*-2match_parent=0match_parent
最后的結(jié)果為3:1:0,所以使用match_parent就很怪異。所以Google官方給的解決方法是推薦layout_width="0dp"或layout_height="0dp"
這樣的權(quán)重就不用像上面一樣糾結(jié)了,十分的方便。

