本篇文章所提到的控制項指:控制項和布局
布局的繼承關係: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的繼承關係去學習,從而形成知識框架。