為了更好地管理Android應用程式的使用者界面元件,Android它提供了一個布局管理。通過使用布局管理,Android具有良好的平台無關的圖形使用者界面應用程式。
平時,推薦布局管理器來管理分布式元件,尺寸,而不是直接設定位置和大小的元件,元件的大小。程式猿要做的。僅僅是為容器選擇合适的布局管理器。
以下是布局管理器的結構圖。

從上圖能夠看出,全部的布局管理器都直接或者間接繼承ViewGroup
線性布局(LineraLayout)
顧名思義,就是一條直線,隻是這條直線擺放滿了,甯可超出螢幕也不換行。
經常使用屬性:
android:divider 設定垂直布局時兩個button之間的分隔條。 android:graviyt 設定布局管理器内元件的對其方式。可選值(top,botton,left。right。center,vertical,fill_vertical,center_horizontal,center,clip_horizontal) android:orientation 設定布局的方向。 可選值(horizontal,vertical)
LineraLayout包括的全部子元素都受LineraLayout.LayoutParams控制(能夠了解為容器給子控件附加的屬性),是以LineraLayout包括的子元素能夠額外指定下面屬性
android:layout_gravity 指定該子元素LineraLayout中的對齊方式 android:layout_width 指定該子元素在LineraLayout中所占的權重
由于線性布局确實沒什麼難度,這裡就不貼代碼了。
表格布局(TableLayout)
表格布局繼承了LineraLayout,是以它的本質依舊是線性布局,表格布局採用行,列的形式來管理UI元件。TableLayout并不須要明白的聲明包括多少行,多少列,而是通過加入TableRow。其它元件來控制表格的行列數。每次向TableLayout中加入一個TableRow。該TableRow就是一個表格行。TableRow也是容器,是以它也能夠不斷地加入其它元件,每加入一個子元件,該表格就添加一列。
假設直接向TableLayout中加入元件。那麼這個元件将直接占用一行。在表格布局中。列的寬度由該列中最寬的那個單元格決定,整個表格的布局寬度取決于父容器的寬度(預設總是占滿父容器本身)
android:collapseColumns 設定須要被隐藏列的序列号,多個序列号之間用逗号隔開 android:shrinkColumns 設定同意被收縮的列的序列号,多個序列之間号用逗号隔開 android:stretchColums 設定同意被拉伸列的序列号。多個序列之間号用逗号隔開
效果圖:
幀布局(FrameLayout)
幀布局直接繼承了VIewGroup元件通常在遊戲開發中使用,并為每一個增加當中的元件建立一個空白的區域(稱為一幀)。每一個子元件占領一幀。這些幀會依據gravity屬性運作自己主動對齊。類似于PS的圖層。假設最後一個局部鋪滿螢幕。那麼僅僅有最後一個控件可見。
另外FrameLayout包括的子元素也受FrameLayout.LayoutParams控制,是以它所包括子元素也可指定android:layout_gravity屬性,該屬性控制該子元素在FrameLayout中的對其方式。
android:foreground 設定該幀布局容器的前景圖像 android:foregroundGravity 定義繪制前景圖像的gravity屬性
以下的Demo是4個TextView疊在一起,上面的TextView遮住以下的TextView
相對布局(RelativeLayout)
相對布局容器内子元件的位置總是相對兄弟元件或者父容器來決定的,是以這樣的布局方式被稱為相對布局。假設A元件的位置是由B元件的位置來決定的,Android要求先定義B元件,在定義A元件。
boolean值的:
android:gravity 設定該布局容器内各元件的對其方式 android:ignoreGravity 設定哪個控件不受gravity影響 相同為了控制子控件的布局分布。Relative提供了内部類Relative.LayoutParams供子元件控制分布 android:layout_centerHorizontal 控件該子元件是否位于布局容器的水準居中 android:layout_centerVertical 控件該子元件是否位于布局容器的垂直居中 android:layout_centerInParent 控制該子元件是否位于布局容器的中央位置 android:layout_alignParentBottom 控制該子元件是否與布局容器底部對齊 android:layout_alignParentLeft 控制該子元件是否與布局容器左邊對齊 android:layout_alignParentRight 控制該子元件是否與布局容器右邊對齊 android:layout_alignParenTop 控制該子元件是否與布局容器頂端對齊
相對于其它ID的:
android:layout_toRightOf 控制該子元件位于給出ID元件的右側 android:layout_toLeftOf 控制該子元件位于給出ID元件的左側 android:layout_abover 控制該子元件位于給出ID的上方 android:layout_below 控制該子元件位于給出ID的下方 android:layout_alignTop 控件該子元件位于給出ID元件的上邊界對齊 android:layout_alignBottom 控件該子元件位于給出ID元件的下邊界對齊 android:layout_alignLeft 控件該子元件位于給出ID元件的左邊界對齊 android:layout_alignRight 控件該子元件位于給出ID元件的右邊界對齊
除此之外,RelativeLayout.LayoutParams繼承了android.view.ViewGroup.MarginLayoutParams,是以RelativeLayout布局容器中每一個元件也可指定android.view.ViewGroup.MarginLayoutParams的XML屬性。
注意:假設單純指定在center控件的左側,系統識别出的區域是左圖效果,由于這個位置不明白,是以還須要它跟那個控件頂部對齊,這樣才幹确定詳細位置。
效果圖:
網格布局(GridLayout)
android中的網格局部是4.0才出現的,假設低版本号使用須要導入對應的支援庫,網格布局的作用類似于 HTML的table标簽。它把整個容器劃分為row*columsn個網格,每一個網格能夠放置一個元件,除此之外。也能夠設定一個元件橫跨多少列,一個元件橫跨多少行
android:alignmentMode 設定該布局管理器採用的對齊模式 android:columnCount 設定該網格列的數量 android:columnOrderPreserved 設定該網格容器是否保留列序号 android:rowCount 設定該網格行的數量 android:rowOrderPreserved 設定該網格容器是否保留行序号 android:useDefaultMargins 設定該網格布局管理器是否使用預設的頁邊距
為了控制GridLayout布局容器中各子元件的布局分布。依舊提供GridLayout.LayoutParams,該内部類提供了大量的XML控制子元件分布
android:layout_column 設定該子元件在GridLayout的第幾列
android:layout_columnSpan 設定該子元件在GridLayout橫向上跨幾列
android:layout_gravity 設定該子元件採用何種方式占領該網格的空間
android:layout_row 設定該子元件在GridLayout的第幾行
android:layout_rowSapn 設定該子元件在GridLayout縱向上跨幾行
接下來看一下簡單模拟電腦的布局:因為控件較多,這裡就用代碼建立空間
java檔案
XML
絕對布局(AbsoluteLayout)
絕對布局不提供不論什麼布局控制,而是由開發者自己通過定義X。Y坐标來控制元件的位置,當使用絕對布局的作為容器的時候。布局管理器不再管理子元件的位置,大小,-----都 是由開發者自己控制,事實上大部分時候,使用絕對布局不是一個好的思路,Android應用千差萬别。螢幕大小。分辨率存在較大差異。使用絕對布局會非常難相容不同螢幕大小。分辨率問題,是以絕對布局已經過時。
android:layout_x 指定該元件的X坐标
android:layout_y指定該元件的Y坐标
這裡就不做具體解釋了。
最後,建議在實際開發中多采用直線布局,相對布局。
版權聲明:本文部落客原創文章,部落格,未經同意不得轉載。