Android布局管理器淺析
在Android應用開發中,為了更好地管理Android應用的用戶界面里的各組件,Android提供了布局管理器來實現Android應用的圖形用戶界面平臺無關性,其中所有布局管理器的父類為ViewGroup。一般來說,推薦使用布局管理器來管理組件的分布、大小,而不是直接設置組件位置和大小。在開發當中,最常用的方法是預先設置好容器邊距(分布)、大小,然后其包含的組件使用"fill_match"或"wrap_content"自動適應父容器即可。</span> 一、LinearLayout線性布局
LinearLayout布局管理器,即控制個組件橫向/縱向排列(android:orientation屬性控制)。需要注意的是,Android的線性布局不會換行,當組件一個挨著一個地排到頭之后,剩下的組件將不會被顯示出來。LinearLayout支持的常用XML屬性。
(1)android:baselineAligned:該屬性設置為false,將會阻止該布局管理器與它的子元素的基線對齊;
(2)android:divider:用于設置垂直布局時兩個按鈕之間的分隔條;
(3)android:gravity:用于設置LinearLayout(容器)所包含的所有子元素的對齊方式,如left|center_vertical代表所有子元素出現在屏幕左邊,而且垂直居中。需要注意的是,一般容器才支持指定該屬性;
(4)android:orientation:設置布局管理器內組件的排列方式,如vertical為垂直排列(默認值);
(5)android:measureWithLargestChild:當該屬性設為true時,所有帶權重的子元素都會具有最大元素的最小尺寸;
(6)android:layout_gravity:指定該子元素在LinearLayout(父容器)中的對齊方式(某個子元素相對于LinearLayout容器而言);
(7)android:layout_weight:指定該子元素在LinearLayout中所占的權重;
理解:LinearLayout布局管理器支持指定所包含控件(widgets)或容器(containers)的填充權值,通過該屬性實現填充屏幕上的剩余空間。避免了在一個大屏幕中,一串widgets或者是containers擠成一堆的情況,而是允許他們放大填充空白,剩余的空間會按這些 widgets或者是containers指定的權值比例分配屏幕。默認的 weight 值為0,表示按照widgets或者是containers實際大小來顯示,若高于0的值,則將Container剩余可用空間分割,分割大小具體取決于每一個widget或者是container的layout_weight及該權值在所有widgets或者是containers中的比例。如有兩個文本,權值分別為2和1,那么剩余空間的2/3給權值為2的,1/3大小給權值為1的。
二、TableLayout表格布局
TableLayout表格布局管理器繼承于LinearLayout,其本質依然是線性布局管理器。表格布局采用行、列的形式來管理UI組件,TableLayout主要通過添加TableRow、其他主鍵來控制表格的行數和列數。即每次向TableLayout中添加一個 TableRow(也為容器),就表示添加一行;向每個TableRow中添加其他子組件該表格就增加一列。
注意:在表格布局中,列的寬度由該列中最寬的那個單元格決定,整個表格布局的寬度則取決于父容器的寬度(默認沾滿父容器)。TableLayout支持的常用XML屬性如下:
(1)支持LinearLayout所有屬性;
(2)android:collapseColumns:如果某個列或多個被設為Collapsed,該列的所有單元格被隱藏;
(3)android:shrinkColumns:如果某個列或多個列設為Shrinkable,該列的所有單元格的寬度可以被收縮,以保證該表格能適應父容器的寬度;
(4)android:stretchColumns:如果某個列或多個列設為Strtchable,該列的所有單元格的寬度可以被拉伸,以保證組件能完全填滿表格剩余空間。
實例如下:定義一個表格布局,指定第1列和第2列可以被拉伸,第3列可以被隱藏
<TableLayout
android:id="+id/tableLayout01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="1,2"
android:collapseColumns="3">
<TableRow ....../>
<TableRow ....../>
</TableLayout>
FrameLayout幀布局繼承于ViewGroup組件,幀布局容器為每個加入其中的組件創建一個空白的區域(即為一幀)。每個子組件占據一幀,這些幀都會根據gravity屬性執行自動對齊,幀布局的效果即把組件一個一個地疊加在一起。FrameLayout支持的常用XML屬性如下:
(1)android:gravity:設置容器中所有子組件的對齊方式;
(2)android:layout_gravity:設置某個子組件相對于容器中的對齊方式;
(3)android:foreground:設置該幀布局容器的前景圖像;
(4)android:foregroundGravity:定義繪制前景圖像的gravity屬性;
舉例:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#f0f"
android:height="300dp"
android:width="300dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#f00"
android:height="250dp"
android:width="250dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#ff0"
android:height="200dp"
android:width="200dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#aaa"
android:height="150dp"
android:width="150dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#fc0"
android:height="100dp"
android:width="100dp" />
</FrameLayout>
顯示效果:


注:android:width 定義控件上面的文本(TextView) 的寬度,需要與 android:layout_width 配合起來作用的,如果 android:layout_width="fill_parent" 的話,那么設置 android:width 是沒有意義的。
四、RelativeLayout相對布局 RelativeLayout表示相對布局,相對布局管理器內子組件的位置總是相對兄弟組件、父容器來決定,每個組件或容器事先需指定android:id屬性。RelativeLayout相對布局支持的常用XML屬性如下:
(1)android:gravity:設置該布局容器各子組件的對齊方式(整體相對于父容器);
(2)android:ignoreGravity:設置哪個組件不受gravity屬性的影響;
(3)android:layout_centerHorizontal:控制該子組件是否位于布局容器的水平居中;
(4)android:layout_centerVertical:控制該子組件是否位于布局容器的垂直居中;
(5)android:layout_centerInParent:控制該子組件是否位于布局容器的中央位置;
(6)android:layout_alignParentButtom:控制該子組件是否位于布局容器的低端對齊;
(7)android:layout_alignParentLeft:控制該子組件是否位于布局容器的左邊對齊;
五、GridLayout網格布局 (8)android:layout_alignParentRight:控制該子組件是否位于布局容器的右邊對齊;
(9)android:layout_alignParentTop:控制該子組件是否位于布局容器的頂端對齊;
(10)android:layout_toRightOf:控制該子組件位于給出ID組件的右側;
(11)android:layout_toLeftOf:控制該子組件位于給出ID組件的左側;
(12)android:layout_above:控制該子組件位于給出ID組件的上方;
(13)android:layout_below:控制該子組件位于給出ID組件的下方;
(14)android:layout_alignTop:控制該子組件位于給出ID組件的上邊界對齊;
(15)android:layout_alignBottom:控制該子組件位于給出ID組件的下邊界對齊;
(16)android:layout_alignLeft:控制該子組件位于給出ID組件的左邊界對齊;
(17)android:layout_alignRight:控制該子組件位于給出ID組件的右邊界對齊;
GridLayout網格布局是Android 4.0新增的布局管理器,只能在Android 4.0及以后的版本使用。GridLayout類似于HTML中的table標簽,它把整個容器劃分成為"行*列"個網格,每個網格可以放置一個組件,另外,也可以設置一個組件橫跨多個列和多個行。GridLayout相對布局支持的常用XML屬性如下:
(1)android:alignmentMode:設置該布局管理器采用的對齊模式;
(2)android:columnCount:設置該網格的列數量;
(3)android:clolumnOrderPreserved:設置該網格容器是否保留列序列號;
(4)android:rowCount:設置該網格的行數量;
(5)android:rowOrderPreserved:設置該網格容器是否保留行序列號;
(6)android:useDefaultMargins:設置該布局管理器是否使用默認的頁邊距 (7)android:layout_column:設置該子組件在GridLayout的第幾列
(8)android:layout_columnSpan:設置該子組件在GridLayout橫向上跨幾行列
(9)android:layout_row:設置該子組件在GridLayout的第幾行
(10)android:layout_rowSpan:設置該子組件在GridLayout縱向上跨幾行
(11)android:layout_gravity:設置該子組件采用何種方式占據該網格的空間(相對于單個網格而言)
六、Android中常用的距離單位
1.px:像素,即每個px對應屏幕上的一個店。
2.dip/dp:設備獨立像素。即一種基于屏幕密度的抽象單位,在每英寸160點的顯示器上,1dip=1px,用于設置組件大小或距離。隨著屏幕密度的改變,dip與px的換算會發生改變。
3.sp(scaled pixels,比例像素):主要處理字體的大小,可以根據用戶的字體大小首選項進行縮放;
4.in:英寸,標準的長度單位;
5.pt:磅,1/72英寸
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!