Android中,布局都是直接或間接的繼承自ViewGroup類,其中,ViewGroup的直接子類目前有:
AbsoluteLayout, AdapterView<T extends Adapter>, DrawerLayout, FragmentBreadCrumbs, FrameLayout, GridLayout, LinearLayout, PagerTitleStrip, RelativeLayout, SlidingDrawer, SlidingPaneLayout, ViewPager。
其中,DrawerLayout、PagerTitleStrip、SlidingPaneLayout和ViewPager 是Android API level 4(1.6版本)及其以后通過引入android.support.v4得以支持。GridLayout是Android API level 7(2.1版本)通過引入android.support.v7得以支持。SlidingDrawer在Android API level 17(4.2版本)廢棄。FragmentBreadCrumbs也較少用到。
同時,雖然TableLayout是繼承自LinearLayout,但TableLayout在日常開發中也經常用到,TableLayout也算在其中。因此,本文將主要講解Android中最常見的幾種布局方式:FrameLayout、LinearLayout、RelativeLayout、TableLayout和AbsoluteLayout。AdapterView<T extends Adapter>將在下一篇中詳細闡述。
1、FrameLayout
Framelayout是Android中最簡單的一種布局方式。其內部的view都是從屏幕左上角開始堆放,如果有多個view,后一個view的可見區域將遮擋前一個view相應區域。
可以簡單的理解成牆角堆放積木的效果。
若想達到不遮擋前一view,可以通過對view設置layout_gravity進行簡單定位。
layout_gravity含義:此view相對於其父布局的對其方式。
2、LinearLayout
LinearLayout即線性布局,可以通過設定設定其android:orientation屬性值來確定是水平方向上的線性布局還是垂直方向上的線性布局。默認為水平方向的線性布局方式。
LinearLayout中的view有一個非常重要的屬性android:weight,表示在相應方向上剩余空間的比重,優先級高於view本身相應方向上的長度。以水平方向為例,如果設置了android:weight,則android:width屬性值建議設置成0dp,以取得更好的性能效果。對於兩個view而言,其中一個未設置android:weight屬性,則默認值為0,另一個設置了android:weight屬性值為1,由1/(1+0)=100%,其將占據此方向上全部的剩余空間。
同時,對於LinearLayout中的view,同樣可以使用android:layout_gravity屬性,但是,是有條件的。對於水平線性布局而言,android:layout_gravity在水平方向上失效;對於垂直線性布局而言,android:layout_gravity在垂直方向上失效。
3、RelativeLayout
RelativeLayout是Android中相對最靈活的一種布局方式。主要可以設置與父控件的對齊方式和相對於其他控件的對其方式。通過靈活設置不同的對齊屬性,可以達到復雜的布局效果,但前提是view需要具有相應的android:id="@+id/viewid"。
4.TableLayout
TableLayout即表格布局。使用TableLayout時需要注意以下幾點:
1). TbaleLayout類似於Html中的table,但是默認行列式沒有邊框的;
2). TableLayout是LinearLayout的子類,因為可以對其中的view使用android:weight屬性;
3). Tablelayout的children不一定是TableRow,也可以直接是其他的view。行列也不像html中的table那樣具有明顯的對其模式;
4). TableLayout中的children無需指定寬度,寬度默認都是match_parent。為其指定其他寬度值都是無效的;
5). TableLayout中的children如果為TableRow,則無需為其指定高度,高度默認都是wrap_content。為其指定其他高度都是無效的,若children為其他view,則可以指定其他寬度值;
6). TableLayout的屬性android:collapseColumns設置隱藏,但是只針對child為tablerow有效;
7). tablelayout的屬性android:stretchColumns設置可拉伸列,android:shrinkColumns 設置可收縮列,優先級都是大於weight屬性。
5、AbsoluteLayout
AbsoluteLayout即絕對布局(坐標布局),是相對於父控件的左上角開始的布局方式。通過給AbsoluteLayout中的view設置android:layout_x和android:layout_y屬性值來確定此view本身左上角的位置,以此完成定位。
AbsoluteLayout在Android API level 3(1.5版本)中已經被廢棄,由於此種布局方式不能較好的適配Android多種不同的屏幕效果,不推薦使用。