Android include與merge標籤使用詳解

Android include與merge標籤使用詳解
1. 簡介
include和merge標籤的作用是實現佈局文件的重用。就是說,爲了高效複用及整合佈局,使佈局輕便化,我們可以使用include和merge標籤將一個佈局嵌入到另一個佈局中,或者說將多個佈局中的相同元素抽取出來,獨立管理,再複用到各個佈局中,便於統一的調整。
比如,一個應用中的多個頁面都要用到統一樣式的標題欄或底部導航欄,這時就可以將標題欄或底部導航欄的佈局抽取出來,再以include標籤形式嵌入到需要的佈局中,而不是多次copy代碼,這樣在修改時只需修改一處即可。

2. include標籤的使用
將需要重用的佈局寫在一個單獨的xml文件中,再使用include標籤複用到其他佈局中。
例如,下面是一個標題欄的佈局文件:

titlebar.xml

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

    <ImageView
        android:id="@+id/tv_setting_title"
        android:layout_width="100dip"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:src="@drawable/logo_for_temp_white" />

    <TextView
        android:id="@+id/tv_back"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/img_back"
        android:drawableLeft="@drawable/avoscloud_feedback_thread_actionbar_back"
        android:gravity="left|center_vertical"
        android:text="返回"
        android:textColor="@color/white"
        android:textSize="@dimen/text_size_large" />

</RelativeLayout>

效果圖如下:

如此就可以將這個標題欄直接複用到其他佈局中了:

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_aty_choose_role"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background_for_temp"
    android:orientation="vertical" >

    <include layout="@layout/titlebar"/>

    ...

    </LinearLayout >

如此,titlebar的內容就可以嵌入到include標籤所在的位置了。

需要注意的地方:
我們可在include標籤中更改一些屬性的值,比如重新設置id,改變佈局屬性(即android:layout_*屬性)等,如下代碼所示:

<include android:id=”@+id/news_titleandroid:layout_width=”match_parent”
         android:layout_height=”match_parent”
         layout="@layout/titlebar"/>
  • 若include標籤中重新指定id,那麼其中的控件就不可當成主xml(包含include標籤的xml)中的控件來直接獲得了,必須先獲得include對應的xml文件(就是titlebar.xml),再通過佈局文件的findViewById方法來獲得其中控件。 當然,若原佈局設置了id屬性,會被覆蓋掉。
  • 當需要在include標籤中改變佈局屬性時,爲了讓其他屬性生效,就必須重寫android:layout_height和android:layout_width屬性,否則任何針對layout調整都是無效的。
  • include有一個缺點就是可能會產生多餘的層級,比如,被複用佈局是一個垂直的LinearLayout佈局,當以include標籤插入到另一個垂直的LinearLayout佈局中時,結果就是一個垂直的LinearLayout裏包含一個垂直的LinearLayout,這個嵌套的佈局並沒有實際意義,只會讓UI性能變差。這時就可以使用merge標籤。

2. merge標籤的使用
merge標籤可以自動消除當一個佈局插入到另一個佈局時產生的多餘的View Group,也可用於替換FrameLayout。用法就是直接使用merge標籤標籤作爲複用佈局的根節點,如下所示:

user.xml

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

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="姓名"/>

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="年齡"/>

</merge>

再使用include標籤複用到其他佈局中:

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_aty_choose_role"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <include layout="@layout/user"/>

    ...

    </LinearLayout >

這時,系統會自動忽略merge標籤,直接把兩個Button替換到include標籤的位置。
也就是說,include和merge是配合使用的。

需要注意的地方:

  • merge標籤只能作爲複用佈局的root元素來使用。
  • 使用它來inflate一個佈局時,必須指定一個ViewGroup實例作爲其父元素並且設置attachToRoot屬性爲true(參考 inflate(int, android.view.ViewGroup, boolean) 方法的說明 )。

3. 未解決

  • 在佈局優化中,Android官方提到了三種方式include 、merge 、ViewStub ,最後一個還未詳細瞭解。
  • 怎麼查看UI層級?瞭解到可以使用tools裏面的hierarchyviewer.bat查看佈局層次,在啓動模擬器啓動所要分析的程序,再啓動hierarchyviewer.bat,選擇模擬器以及該程序,點擊“Load View Hierarchy”,就可以開始分析。還未使用。

轉載請標明出處。

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