布局用于定義activity中ui元素的排列結構,android提供了linearlayout線性布局、relativelayout相對布局 、framelayout幀布局 、tablelayout表格布局、absolutelayout坐标布局 共五種布局,可以通過兩種方式聲明布局:
• 在 xml 中聲明 ui 元素。android 提供了對應于 view 類及其子類的xml 元素
• 運作時執行個體化布局元素。可以通過程式設計建立 view 對象和 viewgroup 對象(并操縱其屬性)。
在 xml 中聲明 ui 的優點在于,可以更好地将應用的外觀與控制應用行為的代碼隔離。ui 描述位于應用代碼外部,這意味着在修改或調整描述時無需修改您的源代碼并重新編譯。例如,可以建立适用于不同螢幕方向、不同裝置螢幕尺寸和不同語言的 xml 布局。此外,在 xml 中聲明布局還能更輕松地顯示 ui 的結構,進而簡化問題調試過程。是以,android應用中普遍采用在xml中布局ui元素。
布局檔案都必須隻包含一個根元素,并且該元素必須是視圖對象或 viewgroup 對象。定義根元素之後,即可再以子元素的形式添加其他布局對象或ui元素,進而逐漸建構定義布局的視圖層次結構
程式清單2.3-1布局檔案的定義
<?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:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello, i am a textview" />
<button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello, i am a button" />
</linearlayout>
在 xml 中聲明布局後,請在您的 android 項目 res/layout/ 目錄中以 .xml 擴充名儲存檔案,以便其能夠正确編譯。
當編譯應用時,每個 xml 布局檔案都會編譯到一個 view 資源中。應該在 activity.oncreate() 回調方法中使用應用代碼加載布局資源。通過調用 setcontentview(),以 r.layout.layout_file_name 形式向其傳遞對布局資源的引用來執行此操作。
程式清單2.3-2布局檔案的定義
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main_layout);
}
3.線性布局
線性布局常用屬性
xml屬性
值
備注
android:orientation
horizontal
vertical
決定橫向排列,還是縱向排列
android:layout_weight
int
将父布局中剩餘的尺寸按各兄弟元素的weight值比例進行配置設定,與“wrap_content”配合使用
android:layout_margin
dp
設定對象邊緣與父布局的邊緣之間的空白
android:padding
設定自身内部元素距離自身邊緣的距離
android:background
color/drawable
設定整個布局畫面的背景
android:gravity
top,bottom,left,right,center
元素在自身所屬區域内的對齊方式
android:layout_gravity
元素在布局中的對齊方式
練習:利用線性布局實作下圖所示效果。

代碼如下:
4.framelayout布局
練習:完成如下圖所示效果

代碼:
5.相對布局relativelayout
一種非常靈活的布局方式,通過指定界面元素與其他元素的相對位置關系,确定界面中所有元素的布局位置。特點:能夠最大程度保證在各種螢幕類型的手機上正确顯示界面布局表.
相對布局屬性比較多,為了便于了解和記憶通常我們把屬性分為三類:
第一類:屬性值為true或false
relativelayout的常用屬性
android:layout_centerhrizontal
水準居中
android:layout_centervertical
垂直居中
android:layout_centerinparent
相對于父元素完全居中
android:layout_alignparentbottom
貼緊父元素的下邊緣
android:layout_alignparentleft
貼緊父元素的左邊緣
android:layout_alignparentright
貼緊父元素的右邊緣
android:layout_alignparenttop
貼緊父元素的上邊緣
第二類:屬性值必須為id的引用名“@id/id-name”,
android:layout_below
在某元素的下方
android:layout_above
在某元素的的上方
android:layout_toleftof
在某元素的左邊
android:layout_torightof
在某元素的右邊
android:layout_aligntop
本元素的上邊緣和某元素的的上邊緣對齊
android:layout_alignleft
本元素的左邊緣和某元素的的左邊緣對齊
android:layout_alignbottom
本元素的下邊緣和某元素的的下邊緣對齊
第三類:屬性值為具體的像素值,主要是調整ui元素之間的間距,如表2.3-5所示
表2.3-5relativelayout的常用屬性
android:layout_marginbottom
離某元素底邊緣的距離
android:layout_marginleft
離某元素左邊緣的距離
android:layout_marginright
離某元素右邊緣的距離
android:layout_margintop
離某元素上邊緣的距離
離某元素右邊緣的距離

6.表格布局tablelayout
tablelayout以行和列的形式對控件進行管理,每一行為一個tablerow對象,或一個view控件。當tablerow對象時,可在tablerow下添加子控件,預設情況下,每個子控件占據一列。有多少個子控件就有多少列;當為view時,該view将獨占一行。
tablelayout的常用屬性
android:layout_colum
指定該單元格在第幾列顯示
android:layout_span
指定該單元格占據的列數(未指定時,為1)
android:stretchcolumns
設定可伸展的列。該列可向行方向伸展,最多可占據一整行
android:shrinkcolumns
設定可收縮的列。當該列子控件的内容太多,已經擠滿所在行,那麼該子控件的内容将往列方向顯示
練習:完成今日頭條界面。
需要完成效果 已完成效果
7.絕對布局absolutelayout
absolutelayout是根據元素指定的x/y坐标值在螢幕上進行顯示的布局。容器的坐标系是以左上角為(0, 0)點,當垂直向下為y軸和水準向右為x軸。absolutelayout 沒有頁邊框,允許元素之間互相重疊。
因為需要為元素固定坐标點,使界面代碼太過剛性,以導緻在不同的裝置上相容性差,開發中我們通常不推薦使用 absolutelayout ,隻需簡單了解即可。
7.gridlayoutbu布局
gridlayout布局使用虛細線将布局劃分為行、列和單元格,也支援一個控件在行、列上都有交錯排列。而gridlayout使用的其實是跟linearlayout類似的api,隻不過是修改了一下相關的标簽而已。gridlayout的布局政策簡單分為以下三個部分:
首先它與linearlayout布局一樣,也分為水準和垂直兩種方式,預設是水準布局,一個控件挨着一個控件從左到右依次排列,但是通過指定android:columncount設定列數的屬性後,控件會自動換行進行排列。另一方面,對于gridlayout布局中的子控件,預設按照wrap_content的方式設定其顯示,這隻需要在gridlayout布局中顯式聲明即可。
其次,若要指定某控件顯示在固定的行或列,隻需設定該子控件的android:layout_row和android:layout_column屬性即可,但是需要注意:android:layout_row=”0”表示從第一行開始,android:layout_column=”0”表示從第一列開始,這與程式設計語言中一維數組的指派情況類似。
最後,如果需要設定某控件跨越多行或多列,隻需将該子控件的android:layout_rowspan或者layout_columnspan屬性設定為數值,再設定其layout_gravity屬性為fill即可,前一個設定表明該控件跨越的行數或列數,後一個設定表明該控件填滿所跨越的整行或整列。
需要完成效果 已完成效果