第一節介紹了建立Android項目時預設生成的布局檔案,預設的布局檔案采用的相對布局RelativeLayout,在這個布局中也預設添加了一個TextView控件。本節講的這個LinearLayout線性布局和RelativeLayout相對布局類似,同屬于布局容器,也可以包裹普通UI控件(TextView、Button等)。
線性布局是按照水準或垂直的方式将布局元素(控件或布局)按照順序依次排列,後面的元素将位于前面元素的下方或右方。至于是下方或右方,和布局設定的方向有關,可以通過設定屬性orientation的值為horizontal(水準)或vertical(垂直)來實作。
3.3.1 LinearLayout基礎用法
下面通過一個執行個體來看一下orientation屬性值為vertical時的效果:
<?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="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="30sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="30sp" />
</LinearLayout>
添加了一個LinearLayout布局容器并設定其orientation屬性值為vertical,按照上面的解釋,所有的子控件都應該垂直排列,通過Android Studio的預覽功能來看一下效果,如圖3.15所示。
圖3.15 Android 布局LinearLayout之vertical
可以看出,兩個TextView控件垂直排列,通過TextView的屬性text的屬性值可以看出,前一個TextView在後一個TextView的上方。
下面修改這個布局檔案的orientation屬性值為horizontal,如下:
<?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="wrap_content"
android:layout_height="wrap_content"
android:text="Hello01!"
android:textSize="30sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello02!"
android:textSize="30sp" />
</LinearLayout>
通過代碼可以看出,将orientation屬性值設定成了horizontal水準布局,由于是水準布局,是以再設定TextView的寬為match_parent(占據整個寬)就不再合适了,因為這樣會造成控件重疊,是以同時修改兩個TextView的layout_width為wrap_content(包裹内容),再次檢視預覽如圖3.16所示。
圖3.16 Android 布局LinearLayout之horizontal
可以看出兩個TextView水準顯示,下面的TextView在上面TextView的右邊。注意orientation屬性為Linearlayout的必設屬性。
3.3.2 LinearLayout嵌套
除了單個LinearLayout的使用,也支援LinearLayout的嵌套,下面通過一個執行個體看一下如何通過LinearLayout的嵌套來實作模拟微信的底部Tab:
<?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="70dp"
android:background="#ffffffff"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_chat"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/img_chat"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="#0000"
android:src="@drawable/chat_yes" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="微信"
android:textColor="#b6b3b3" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_frd"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/img_frd"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="#0000"
android:src="@drawable/frd_no" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通訊錄"
android:textColor="#b6b3b3" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_find"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/img_find"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="#0000"
android:src="@drawable/find_no" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="發現"
android:textColor="#b6b3b3" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_me"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/img_me"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="#0000"
android:src="@drawable/me_no" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我"
android:textColor="#b6b3b3" />
</LinearLayout>
</LinearLayout>
通過代碼可以看出一個LinearLayout内部包裝了四個子LinearLayout,外部的LinearLayout采用水準布局(設定了orientation屬性為horizontal),四個子LinearLayout采用了垂直布局(每一個子LinearLayout的屬性orientation都為vertical)。每一個LinearLayout内都添加了一個ImageView(圖檔控件)和一個TextView(文本控件)。
除了上面講過的屬性以外,還有一些屬性沒有介紹,通過表3.2所示來說明它們的用法:
表3.2 LinearLayout屬性
為父LinearLayout設定了background屬性,其值為 #ffffffff(純白色);為子LinearLayout設定了gravity屬性并設定其值為center,子LinearLayout将居中顯示。設定weight屬性可以平分整個螢幕的寬,這個屬性的用法在後面的章節會詳細介紹;為ImageView添加了src屬性來設定圖檔背景,這個值的形式為“@drawable/圖檔名”;為TextView添加了textColor屬性來設定字型顔色,其值為 #b6b3b3(淺灰色)。
可以通過Android Studio的預覽功能檢視一下效果如圖3.17所示。
圖3.17 Android 布局LinearLayout執行個體
可以看出,父LinearLayout的背景為純白色,每個子LinearLayout也都是居中顯示并四等分了整個螢幕的寬,每個LinearLayout上方的ImageView控件都添加了不同的圖檔,下方的TextView都設定了不同的文本和相同的文本顔色(淺灰色)。
如果你喜歡作者的文章,還可以購買他的書(京東自營):