Android裏merge和include標籤的使用及區別

1.使用 標籤來重用layout代碼

如果在一個項目中需要用到相同的佈局設計,可以通過 標籤來重用layout代碼,該標籤在Android開發文檔中沒有相關的介紹。在android主屏程序中 用到了這個標籤:

<com.android.launcher.Workspace   
 android:id="@+id/workspace"    
 android:layout_width="fill_parent"    
 android:layout_height="fill_parent"    
 launcher:defaultScreen="1">    
  <include android:id="@+id/cell1" layout="@layout/workspace_screen" />   
  <include android:id="@+id/cell2" layout="@layout/workspace_screen" />    
  <include android:id="@+id/cell3"layout="@layout/workspace_screen" />  
</com.android.launcher.Workspace>  

這樣可以多次引用一個佈局片段而不用重複的複製、粘貼。通過include標籤也可以覆寫一些屬性的值,例如上面的示例就覆寫了引用的layout中的id值。下面是另外一個示例:

<include android:layout_width="fill_parent"layout="@layout/image_holder" />  
<include android:layout_width="256dip" layout="@layout/image_holder" />  

2.使用 標籤來減少視圖層級結構

在Android layout文件中需要一個頂級容器來容納其他的組件,而不能直接放置多個組件,例如如下的代碼:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent">  

    <ImageView  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"   
        android:scaleType="center"  
        android:src="@drawable/golden_gate" />  

    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="Golden Gate" />  

</FrameLayout> 

單獨將標籤做個介紹,是因爲它在優化UI結構時起到很重要的作用。目的是通過刪減多餘或者額外的層級,從而優化整個Android Layout的結構。

3.將通過一個例子來了解這個標籤實際所產生的作用,這樣可以更直觀的瞭解的用法。

建立一個簡單的Layout,其中包含兩個Views元素:ImageView和TextView 默認狀態下我們將這兩個元素放在FrameLayout中。其效果是在主視圖中全屏顯示一張圖片,之後將標題顯示在圖片上,並位於視圖的下方。以下是xml代碼:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent">  

    <ImageView  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"   

        android:scaleType="center"  
        android:src="@drawable/golden_gate" />  

    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="20dip"  
        android:layout_gravity="center_horizontal|bottom"  

        android:padding="12dip"  

        android:background="#AA000000"  
        android:textColor="#ffffffff"  

        android:text="Golden Gate" />  

</FrameLayout>  

在SDK目錄下tools文件夾下使用
tools> hierarchyviewer.bat工具查看當前UI結構視圖:
這裏寫圖片描述
我們可以很明顯的看到出現了兩個framelayout節點,很明顯這兩個完全意義相同的節點造成了資源浪費(這裏可以提醒大家在開發工程中可以習慣性的通過hierarchyViewer查看當前UI資源的分配情況),那麼如何才能解決這種問題呢(就當前例子是如何去掉多餘的frameLayout節點)?這時候就要用到標籤來處理類似的問題了。我們將上邊xml代碼中的framLayout替換成merge:

<merge xmlns:android="http://schemas.android.com/apk/res/android">  

    <ImageView  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"   

        android:scaleType="center"  
        android:src="@drawable/golden_gate" />  

    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="20dip"  
        android:layout_gravity="center_horizontal|bottom"  

        android:padding="12dip"  

        android:background="#AA000000"  
        android:textColor="#ffffffff"  

        android:text="Golden Gate" />  

</merge>  

這裏寫圖片描述

運行程序後在Emulator中顯示的效果是一樣的,可是通過hierarchyviewer查看的UI結構是有變化的,當初多餘的FrameLayout節點被合併在一起了,或者可以理解爲將merge標籤中的子集直接加到Activity的FrameLayout跟節點下(這裏需要提醒大家注意:所有的Activity視圖的根節點都是frameLayout)。如果你所創建的Layout並不是用framLayout作爲根節點(而是應用LinerLayout等定義root標籤),就不能應用上邊的例子通過merge來優化UI結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章