1. 程式人生 > >Android中常用的5大布局詳述

Android中常用的5大布局詳述

  Android的介面是有佈局和元件協同完成的,佈局好比是建築裡的框架,而元件則相當於建築裡的磚瓦。元件按照佈局的要求依次排列,就組成了使用者所看見的介面。

      

      所有的佈局方式都可以歸類為ViewGroup的5個類別,即ViewGroup的5個直接子類。其它的一些佈局都擴充套件自這5個類

  • 線性佈局(LinearLayout):按照垂直或者水平方向佈局的元件。
  • 幀佈局(FrameLayout):元件從螢幕左上方佈局元件。
  • 表格佈局(TableLayout):按照行列方式佈局元件。
  • 相對佈局(RelativeLayout):相對其它元件的佈局方式。
  • 絕對佈局(AbsoluteLayout):按照絕對座標來佈局元件

1. LinearLayout 線性佈局

線性佈局是Android開發中最常見的一種佈局方式,它是按照垂直或者水平方向來佈局,通過“android:orientation”屬性可以設定線性佈局的方向。屬性值有垂直(vertical)和水平(horizontal)兩種。

常用的屬性:

android:orientation:可以設定佈局的方向
android:gravity:用來控制組件的對齊方式
layout_weight:控制各個元件在佈局中的相對大小

(1)android:orientation="vertical" 表示豎直方式對齊
(2)android:orientation="horizontal"
表示水平方式對齊

(3)android:layout_width="fill_parent"定 義當前檢視在螢幕上
可以消費的寬 度,fill_parent即填充整個螢幕。

(4)android:layout_height="wrap_content": 隨著文字欄位的不同    而 改變這個檢視的寬度或者高度。有點自動設定框度或者高度的意思  

layout_weight預設值是零,用於給一個線性佈局中的諸多檢視的重要度賦值。比如說我們在 水平方向上有一個文字標籤和兩個文字編輯元素,該文字標籤並無指定layout_weight值,所以它將佔據需要提供的最少空間  ;如果兩個文字編輯元素每一個的layout_weight值都設定為1

, 則兩者平分在父檢視佈局剩餘的寬度(因為我們宣告這兩者的重要度相等)如果兩個文字編輯元素其中第一個的layout_weight值設定為1,而 第二個的設定為2則剩餘空間的三分之分給第二個,三分之二分給第一個(正比劃分)。(僅在LinearLayou中有效)。

首看看一個樣例 使用 weight:

xml佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:weightSum="3" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="@android:color/black"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="@android:color/holo_blue_light"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="@android:color/holo_green_dark"
        android:text="TextView" />

</LinearLayout>

複雜一點的樣例,使用gravity:

XML佈局檔案:

<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:background="@android:color/black">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:orientation="vertical" >
        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
              >
        </EditText>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:orientation="horizontal"
        android:gravity="right"
        >
 <!-- android:gravity="right"表示LinearLayout內部元件向右對齊 --> 
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="確 認" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="取消" />

    </LinearLayout>

</LinearLayout></span>

2.FrameLayout(框架佈局)

框架佈局是最簡單的佈局形式。所有新增到這個佈局中的檢視都以層疊的方式顯示。第一個新增的控制元件被放在最底層,最後一個新增到框架佈局中的檢視顯示在最頂層,上一層的控制元件會覆蓋下一層的控制元件。這種顯示方式有些類似於堆疊。

作為android六大布局中最為簡單的佈局之一,該佈局直接在螢幕上開闢出了一塊空白區域,

當我們往裡面新增元件的時候,所有的元件都會放置於這塊區域的左上角;

幀佈局的大小由子控制元件中最大的子控制元件決定,

如果都元件都一樣大的話,同一時刻就只能能看到最上面的那個元件了!

當然我們也可以為元件新增layout_gravity屬性,從而制定元件的對其方式

前景影象:

永遠處於幀佈局最頂的,直接面對使用者的影象,,就是不會被覆蓋的圖片

常用屬性:

android:foreground:設定該幀佈局容器的前景影象

android:foregroundGravity:設定前景影象顯示的位置

例項:xml佈局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">
    <TextView android:id="@+id/textview1" 
        android:layout_width="300dp"
        android:layout_height="300dp" 
        android:layout_gravity="center" 
        android:background="#FF33ffff" />
    <TextView android:id="@+id/textview2" 
        android:layout_width="240dp"
        android:layout_height="240dp" 
        android:layout_gravity="center" 
        android:background="#FF33ccff" />
    <TextView android:id="@+id/textview3" 
        android:layout_width="180dp"
        android:layout_height="180dp" 
        android:layout_gravity="center" 
        android:background="#FF3399ff" />
    <TextView android:id="@+id/textview4" 
        android:layout_width="120dp"
        android:layout_height="120dp" 
        android:layout_gravity="center" 
        android:background="#FF3366ff" />
    <TextView android:id="@+id/textview5" 
        android:layout_width="60dp"
        android:layout_height="60dp" 
        android:layout_gravity="center" 
        android:background="#FF3300ff" />
</FrameLayout>

效果如下:


3.TableLayout(表格佈局)

把子元素放入到行與列中 不顯示行、列或是單元格邊界線 單元格不能橫跨行,如HTML中一樣 表格佈局模型以行列的形式管理子控制元件,每一行為一個TableRow的物件,當然也可以是一個View的物件。TableRow可以新增子控制元件,每新增一個為一列。

適用於N行N列的佈局格式。一個TableLayout由許多TableRow組成,一個TableRow就代表TableLayout中的一行。

  TableRow是LinearLayout的子類,ablelLayout並不需要明確地宣告包含多少行、多少列,而是通過TableRow,以及其他元件來控制表格的行數和列數, TableRow也是容器,因此可以向TableRow裡面新增其他元件,沒新增一個元件該表格就增加一列。如果想TableLayout裡面新增元件,那麼該元件就直接佔用一行。在表格佈局中,列的寬度由該列中最寬的單元格決定,整個表格佈局的寬度取決於父容器的寬度(預設是佔滿父容器本身)。

  TableLayout繼承了LinearLayout,因此他完全可以支援LinearLayout所支援的全部XML屬性,除此之外TableLayout還支援以下屬性:

       XML屬性                                       相關用法                                                    說明

  1. andriod:collapseColumns           setColumnsCollapsed(int ,boolean)       設定需要隱藏的列的序列號,多個用逗號隔開

  2.android:shrinkColumns              setShrinkAllColumns(boolean)                 設定被收縮的列的序列號,多個用逗號隔開

  3.android:stretchColimns             setSretchAllColumnds(boolean)               設定允許被拉伸的列的序列號,多個用逗號隔開

看一下例項會比較好理解:

XML佈局檔案

    <?xml version="1.0" encoding="utf-8"?>  
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        >  
        <TableRow>  
            <Button android:text="Button1"/>  
            <Button android:text="Button2"/>  
            <Button android:text="Button3"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button4"/>  
            <Button android:text="Button5"/>  
            <Button android:text="Button6"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button7"/>  
            <Button android:text="Button8"/>  
            <Button android:text="Button9"/>  
        </TableRow>  
    </TableLayout> 

(1)shrinkColumns屬性:以0為序,當TableRow裡面的控制元件佈滿佈局時,指定列自動延伸以填充可用部分;當TableRow裡面的控制元件還沒有佈滿佈局時,shrinkColumns不起作用。

例:設定 shrinkColumns="2"當第二列過長時會自動延伸填充可用部分(如果不超長,shrinkColumns不起作用)

在佈局檔案中新增shrinkColumns屬性程式碼:

    <?xml version="1.0" encoding="utf-8"?>  
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:shrinkColumns="2"
        >  
        <TableRow>  
            <Button android:text="Button1"/>  
            <Button android:text="Button2"/>  
            <Button android:text="Button333333333333333333333"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button4"/>  
            <Button android:text="Button5"/>  
            <Button android:text="Button6"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button7"/>  
            <Button android:text="Button8"/>  
            <Button android:text="Button9"/>  
        </TableRow>  
    </TableLayout> 

效果如下:

(2)strechColumns屬性,以第0行為序,指定列對空白部分進行填充。

在佈局中新增stretchColumns屬性程式碼如下:

    <?xml version="1.0" encoding="utf-8"?>  
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:stretchColumns="2"
        >  
        <TableRow>  
            <Button android:text="Button1"/>  
            <Button android:text="Button2"/>  
            <Button android:text="Button3"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button4"/>  
            <Button android:text="Button5"/>  
            <Button android:text="Button6"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button7"/>  
            <Button android:text="Button8"/>  
            <Button android:text="Button9"/>  
        </TableRow>  
    </TableLayout>  
效果如下:

(3)collapseColumns屬性:以0行為序,隱藏指定的列

在佈局中新增android:collapseColumns="2"指定第3列隱藏

   <?xml version="1.0" encoding="utf-8"?>  
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:collapseColumns="2"
        >  
        <TableRow>  
            <Button android:text="Button1"/>  
            <Button android:text="Button2"/>  
            <Button android:text="Button3"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button4"/>  
            <Button android:text="Button5"/>  
            <Button android:text="Button6"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button7"/>  
            <Button android:text="Button8"/>  
            <Button android:text="Button9"/>  
        </TableRow>  
    </TableLayout>  
效果如下:

(4)layout_column屬性:以0行為序,設定元件顯示指定列

(5)layout_span屬性:以第0行為序,設定元件顯示佔用的列數。

佈局程式碼如下
    <?xml version="1.0" encoding="utf-8"?>  
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent">  
        <TableRow>  
            <Button android:text="Button1"  
                android:layout_span="3"/>  
            <Button android:text="Button2"/>  
            <Button android:text="Button3"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button4"  
                android:layout_column="2"/>  
            <Button android:text="Button5"  
                android:layout_column="0"/>  
            <Button android:text="Button6"/>  
        </TableRow>  
        <TableRow>  
            <Button android:text="Button7"/>  
            <Button android:text="Button8"/>  
            <Button android:text="Button9"/>  
        </TableRow>  
    </TableLayout>  

效果如下:

從效果圖可知:Button1被設定了佔用了3列,Button4被設定顯示在地3列,但程式碼指定Button5顯示在第一列,但沒有按照設定顯示,這樣可知TableRow在表格佈局中,一行裡的元件都會自動放在前一元件的右側,依次排列,只要確定了所在列,其後面的元件就無法在進行設定位置。

4.RelativeLayout(相對佈局)

 RelativeLayout繼承於android.widget.ViewGroup,其按照子元素之間的位置關係完成佈局的,相對佈局的子控制元件會根據它們所設定的參照控制元件和引數進行相對佈局。參照控制元件可以是父控制元件,也可以是其它子控制元件,作為Android系統五大布局中最靈活也是最常用的一種佈局方式,非常適合於一些比較複雜的介面設計。

   注意:在引用其他子元素之前,引用的ID必須已經存在,否則將出現異常。

RelativeLayout用到的一些重要的屬性:第一類:屬性值為true或false

控制元件於容器

android:layout_centerHrizontal                                           水平居中
android:layout_centerVertical                                            垂直居中
android:layout_centerInparent                                           相對於父元素完全居中

android:layout_alignParentBottom                     貼緊父元素的下邊緣
android:layout_alignParentLeft                        貼緊父元素的左邊緣
android:layout_alignParentRight                       貼緊父元素的右邊緣
android:layout_alignParentTop                        貼緊父元素的上邊緣
android:layout_alignWithParentIfMissing               如果對應的兄弟元素找不到的話就以父元素做參照物

第二類:屬性值必須為id的引用名“@id/id-name”

控制元件於控制元件位置相關, 

android:layout_below                          在某元素的下方
android:layout_above                          在某元素的的上方
android:layout_toLeftOf                       在某元素的左邊
android:layout_toRightOf                     在某元素的右邊

控制元件於控制元件對齊相關
android:layout_alignTop                      本元素的上邊緣和某元素的的上邊緣對齊
android:layout_alignLeft                      本元素的左邊緣和某元素的的左邊緣對齊
android:layout_alignBottom                 本元素的下邊緣和某元素的的下邊緣對齊
android:layout_alignRight                    本元素的右邊緣和某元素的的右邊緣對齊

android:layout_alignBaseline             本元素與和某元素的基準線對齊

基線解釋:書寫英語單詞時為了規範書寫會設有四條線,從上至下第三條就是基線。基線對齊主要是為了兩個控制元件中顯示的英文單詞的基線對齊。

圖中綠色的水平線就是基線  TextView2 基線和 TextView1對齊,TextView2設定屬性

android:layout_alignBaseline="@id/textView1"

android:layout_alignBottom  本元素的下邊緣和某元素的的下邊緣對齊 效果:

第三類:屬性值為具體的畫素值,如30dip,40px
android:layout_marginBottom              離某元素底邊緣的距離
android:layout_marginLeft                   離某元素左邊緣的距離
android:layout_marginRight                 離某元素右邊緣的距離
android:layout_marginTop                   離某元素上邊緣的距離

例:xml 佈局如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textSize="30sp"
        android:layout_marginTop="40dp"
        android:background="@android:color/white"
       >
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/editText1"
        android:layout_below="@+id/editText1"
        android:layout_marginRight="78dp"
        android:layout_marginTop="19dp"
        android:text="確定" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_alignParentRight="true"
        android:text="取消" />

</RelativeLayout>

效果如下:

(1),EditText 控制元件 位於父控制元件的上部 使用 layout_alignParentTop;

(1),EditText 控制元件 相對父控制元件水平居中使用layout_centerHorizontal

(1),EditText 控制元件距離上邊框 40dp 使用layout_marginTop

(2),button1控制元件右邊緣和EditText控制元件的右邊緣對齊使用 layout_alignRight

(2),button1控制元件 在EditText控制元件的下方使用layout_below

(2),button1控制元件 距離右邊框78dp 使用layout_marginRight

(2),button1控制元件 距離上邊控制元件 19dp 使用 layout_marginTop

(3),button2控制元件button2控制元件基線對齊使用layout_alignBaseline

(3),button2控制元件下邊緣和button2控制元件的下邊緣對齊使用layout_alignBottom

(3),button2控制元件貼緊父元素的右邊緣layout_alignParentRight

5.AbsoluteLayout(絕對佈局)

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

在Android2.0 API文件中標明該類已經過期,可以使用FrameLayout或者RelativeLayout來代替。

例:


XML佈局檔案:

<?xml version = "1.0" encoding = "utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/black"
     >

    <TextView
        android:id="@+id/lable"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:layout_x="30dp"
        android:layout_y="50dp"
        android:textColor="@android:color/white"
        android:background="@android:color/holo_orange_dark"
        android:text="我是絕對佈局" />

</AbsoluteLayout>

除上面講過之外常用的幾個佈局的屬性:
(1)layout_margin 
用於設定控制元件邊緣相對於父控制元件的邊距
android:layout_marginLeft 
android:layout_marginRight
android:layout_marginTop
android:layout_marginBottom

(2) layout_padding 
用於設定控制元件內容相對於控制元件邊緣的邊距
android:layout_paddingLeft
android:layout_paddingRight
android:layout_paddingTop
android:layout_paddingBottom

(3) layout_width/height
用於設定控制元件的高度和寬度
wrap_content 內容包裹,表示這個控制元件的裡面文字大小填充
fill_parent 跟隨父視窗
match_parent

(4) gravity 
用於設定View元件裡面內容的對齊方式
top bottom left   right  center等

(5) android:layout_gravity  
layout_gravity是用來設定該view相對與父view 位置

top bottom left   right  center等