1. 程式人生 > >Android常用ViewGroup之LinearLayout

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>

居中效果.jpg

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>

垂直居中.jpg

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>

權重.jpg

拓展

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的效果實際是在這個區域裡面進行對齊處理
區域.jpg

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>

權重分配效果.jpg
中間紅色的TextView變小了,左右兩邊變大了。
權重屬性值生效是在子view已經分配完空間之後,對剩餘空間的按照權重的比值進行處理,上面三個view的權重比是1:1:1,所以每個分剩餘空間的1/3。