天天看點

淺談Android中常用的五種布局方式

本篇文章所提到的控件指:控件和布局

布局的繼承關系:LinearLayout,RelativeLayout,FrameLayout,AbsoluteLayout都是ViewGroup的子類,是以有些屬性可以有交集,應具體對待。

而TableLayout是LinearLayout的子類,是以大多數LinearLayout的屬性都可以用。

子類擁有父類的屬性。

一、LinearLayout(orientation)

線性布局是按照水準或垂直的順序将子元素(可以是控件或布局)依次按照順序排列,每一個元素都位于前面一個元素之後,即控件在xml中所寫的先後循序就是顯示時控件的順序。

線性布局及子類特有的屬性:

權重:剩餘螢幕占有的比例

一般情況:在那個方向上設權重,則将該方向的屬性(height或者width)設定為0dp

如果在該方向設wrap_content:權重值越大,占得螢幕比例越多,但小不warp_contant

如果設match_parent:權重值越大,占得螢幕比例越小,但大大不過match_parent

缺點:缺乏靈活性,不能任意指定位置。不過掌握好權重能彌補很多線性布局的缺點。

不适用場景:兩個空間之間有很大空隙的布局,雖然有layout_marginTop等類似屬性,卻不好控制具體位置,而且用layout_marginTop達到目的,也隻是在特定分辨率手機上适配,不能很好适配其他分辨率。

二、RelativeLayout

按照子元素之間的相對位置關系完成布局的,作為Android系統五大布局中最靈活也是最常用的一種布局方式。

值得注意的是:相對布局的參照控件必須在被參照控件的後面,在編寫xml布局檔案時注意。

相對布局特有的屬性:值是某個控件和布局的id

android:layout_below 在某控件的下方

android:layout_above 在某控件的的上方

android:layout_toLeftOf 在某控件的左邊

android:layout_toRightOf 在某控件的右邊

android:layout_alignTop 本控件的上邊緣和某控件的的上邊緣對齊

android:layout_alignLeft 本控件的左邊緣和某控件的的左邊緣對齊

android:layout_alignBottom 本控件的下邊緣和某控件的的下邊緣對齊

android:layout_alignRight 本控件的右邊緣和某控件的的右邊緣對齊

相對布局剛好填補了線性布局的缺點,但是相對布局也并非沒有缺點。

缺點:每個空間都必須設定id,使用繁瑣,如果修改了某一個控件則可能需要重新布局,操作不易。

注:某一個控件可能同時依賴于多個控件,一個控件同時可能被多個控件依賴。并非單一依賴。

三、FrameLayout:

所有東西依次都放在左上角,會重疊,這個布局比較簡單,也隻能放一點比較簡單的東西。

特點:後添加進去的控件将從左上角覆寫先放進去的控件

适用場景:在開發中常做容器使用,用于動态添加布局對象。

四、AbsoluteLayout:

這種布局方式也比較簡單,但是在螢幕旋轉時,往往會出問題,而且多個元素的時候,計算比較麻煩。

絕對布局中将所有的子元素通過設定android:layout_x 和 android:layout_y屬性,将子元素的坐标位置固定下來,即坐标(android:layout_x, android:layout_y) ,layout_x用來表示橫坐标,layout_y用來表示縱坐标。 螢幕左上角為坐标(0,0),橫向往右為正方,縱向往下為正方。實際應用中,這種布局用的比較少,因為Android終端一般機型比較多,各自的螢幕大小。分辨率等可能都不一樣,如果用絕對布局,可能導緻在有的終端上顯示不全等

值得注意:該布局的原點在左上角。

缺點:螢幕适配麻煩,容易出問題,在實際開發中不常用。

五、TableLayout:

表格布局,适用于多行多列的布局格式,每個TableLayout是由多個TableRow組成,一個TableRow就表示TableLayout中的每一行,這一行可以由多個子元素組成。實際上TableLayout和TableRow都是LineLayout線性布局的子類。但是TableRow的參數android:orientation屬性值固定為horizontal,且android:layout_width=MATCH_PARENT,android:layout_height=WRAP_CONTENT。是以TableRow實際是一個橫向的線性布局,且是以子元素寬度和高度一緻。

值得注意的是:列和行下标是從0開始的

特殊屬性:collapseColumns:隐藏列,多個列之間逗号隔開

            StretchColumns:設定某個列是可伸展的。

            shrinkColumns :可收縮的

一下兩屬性不能自動提示,不知為何,個人覺得不建議使用該屬性。

android:layout_colum:設定控件在具體的列

android:layout_span:設定控件所跨越的列數。

使用場景:特别規範的展示資料或者選項區,除了特殊場景外,開發中一般不使用。

缺點:過于規範,不夠靈活,不能設計出不規則的界面

總結:每一個布局都有自己适合的方式,這五個布局元素可以互相嵌套應用,做出美觀的界面。每一個布局都有自己的使用場合,就像每個人一樣在生活中扮演者重要角色,或多或少都有作用。

注意:有些界面雖然某個布局能單獨完成,但是推薦使用布局嵌套。而且根布局推薦使用相對布局。

最常用的布局:FrameLayout做容器,而RelativeLayout和LinearLayout嵌套做布局。市面上的:三層式界面都是基于這樣做的,最上面是标題欄,中間是動态加載的布局對象,最下面是RadioGroup。父容器是FrameLayout。

學習建議:根據java的繼承關系去學習,進而形成知識架構。

繼續閱讀