Android常用ViewGroup之LinearLayout
文章目錄
簡介
線性佈局在開發中使用很多,可以用來做垂直方向或水平方向的view佈局。
重要屬性
- android:orientation 控制view佈局的方向,是必需屬性。取值vertical或者horizontal,預設值是horizontal。 - android:gravity 控制內部子View對齊方式,常用取值center、center_vertical、center_horizontal、top 、bottom、left、right等,這個不是線性佈局的特有屬性,這個是View的通用屬性。可以同時取多個使用"|"進行或運算 比如:android:gravity="center_vertical|left" 垂直居中並對齊左邊
- 子View中使用的屬性
- android:layout_weight 權重,線性佈局子view的特有屬性。用來分配線性佈局的剩餘空間的。使用權重一般要把分配該權重方向的長度設定為零,比如在水平方向分配權重,就把width設定為零。 使用這個屬性可以輕鬆實現例如水平方向兩個按鈕各佔1/2空間的效果,而沒有適配問題。 - android:layout_gravity 設定子view在父容器中的顯示位置。常用屬性值有center、center_vertical、center_horizontal、top、bottom、left、right等 注意center的取值效果,這裡並不是表示顯示在LinearLayout的中心,當LinearLayout線性方向為垂直方向時,center表示水平居中,但是並不能垂直居中,此時等同於center_horizontal的作用;同樣當線性方向為水平方向時,center表示垂直居中,等同於center_vertical
示例
1、線性佈局使用 android:gravity=“center”
<?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:gravity="center"//取值center的效果 android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="40dp" android:gravity="center" android:background="#aaaaaa" android:text="HelloWorld" /> </LinearLayout>
2、子view使用 android:layout_gravity=“center”
<?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="horizontal">
<TextView
android:layout_gravity="center" //線性佈局水平方向時效果實際是垂直居中等同於設定center_vertical
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#aaaaaa"
android:text="HelloWorld" />
</LinearLayout>
3、使用layout_weight實現的效果
兩邊兩個TextView寬度一定,中間的空間讓另一個TextView佔滿
<?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="horizontal">
<TextView
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#aaaaaa"
android:gravity="center"
android:text="HelloWorld" />
<TextView
android:background="#FF0000"
android:layout_weight="1"//使用權重
android:gravity="center"
android:text="HelloWorld"
android:layout_width="0dp"
android:layout_height="40dp" />
<TextView
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#aaaaaa"
android:gravity="center"
android:text="HelloWorld" />
</LinearLayout>
拓展
1、線性佈局中android:gravity和android:layout_gravity為什麼效果不一致?
android:gravity含義是設定當前view的內容在當前view的內部對齊方式。android:layout_gravity屬性以layout_開頭,只能在子View中使用,表達的含義是子view在父佈局中對齊方式。從含義上來講示例1和示例2相同,但是顯示效果是不一樣的。
可以這樣理解當給線性佈局設定android:gravity屬性時,會實際產生期望的效果。當線上性佈局中子view使用android:layout_gravity時,實際上是對子view所在的水平區域或者垂直區域做對齊處理。
比如線性佈局是水平方向,我們設定其填滿父佈局,xml示例
<?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="horizontal">
<TextView
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#aaaaaa"
android:layout_gravity="center"
android:text="HelloWorld" />
</LinearLayout>
由於線性佈局不能自動換行,會一直往水平方向新增view,所以會產生垂直方向的區域,如下圖,此時layout_gravity的效果實際是在這個區域裡面進行對齊處理
2、線性佈局子View使用layout_weight(權重)的含義
線性佈局中每個子view都可以預先設定自己的寬高資料。以示例3講解,
我先設定左右兩邊兩個TextView的固定的寬高值,中間的寬度設定為0,此時水平方向的剩餘空間,線性佈局就會根據子view的權重比值來分配,由於我只給中間的view的設定了權重,所以這個權重值無論是什麼剩餘空間都會全部分配給它。
那如果我希望左右兩邊的view和中間的view共享剩餘的空間,看下面的效果
<?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="horizontal">
<TextView
android:layout_weight="1"//使用權重
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#aaaaaa"
android:gravity="center"
android:text="HelloWorld" />
<TextView
android:background="#FF0000"
android:layout_weight="1"//使用權重
android:gravity="center"
android:text="HelloWorld"
android:layout_width="0dp"
android:layout_height="40dp" />
<TextView
android:layout_weight="1"//使用權重
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#aaaaaa"
android:gravity="center"
android:text="HelloWorld" />
</LinearLayout>
中間紅色的TextView變小了,左右兩邊變大了。
權重屬性值生效是在子view已經分配完空間之後,對剩餘空間的按照權重的比值進行處理,上面三個view的權重比是1:1:1,所以每個分剩餘空間的1/3。