將通過一個例子來了解這個標簽實際所產生的作用,這樣可以更直觀的了解<merge/>的用法。
建立一個簡單的Layout,其中包含兩個Views元素:ImageView和TextView 默認狀態下我們將這兩個元素放在FrameLayout中。其效果是在主視圖中全屏顯示一張圖片,之后將標題顯示在圖片上,並位於視圖的下方。以下是xml代碼:
<?xml version="1.0" encoding="utf-8"?> <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/rain" /> <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 Gate2" /> </FrameLayout>
應用上邊的Layout運行的視圖為:
啟動 tools> hierarchyviewer.bat工具查看當前UI結構視圖:
我們可以很明顯的看到出現了兩個framelayout節點,很明顯這兩個完全意義相同的節點造成了資源浪費,那么如何才能解決這種問題呢(就當前例子是如何去掉多余的frameLayout節點)?這時候就要用到<merge />標簽來處理類似的問題了。
這里可以提醒大家在開發工程中可以習慣性的通過hierarchyViewer查看當前UI資源的分配情況。 Hierarchy Viewer是隨AndroidSDK發布的工具,位置在tools文件夾下,名為hierarchyviewer.bat。它是Android自帶的非常有用而且使用簡單的工具,可以幫助我們更好地檢視和設計用戶界面(UI),絕對是UI檢視的利器。具體可以看這篇文章 Android工具Hierarchy Viewer
我們將上邊xml代碼中的framLayout替換成merge:
<?xml version="1.0" encoding="utf-8"?> <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/rain" /> <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 Gate2" /> </merge>
UI結構圖:
運行程序后在Emulator中顯示的效果是一樣的,可是通過hierarchyviewer查看的UI結構是有變化的,當初多余的FrameLayout節點被合並在一起了,或者可以理解為將merge標簽中的子集直接加到Activity的FrameLayout跟節點下(這里需要提醒大家注意:所有的Activity視圖的根節點都是frameLayout)。如果你所創建的Layout並不是用framLayout作為根節點(而是應用LinerLayout等定義root標簽),就不能應用上邊的例子通過merge來優化UI結構。
除了上邊的例子外,meger還有另外一個用法,當應用Include或者ViewStub標簽從外部導入xml結構時,可以將被導入的xml用merge作為根節點表示,這樣當被嵌入父級結構中后可以很好的將它所包含的子集融合到父級結構中,而不會出現冗余的節點。
另外有兩點需要特別注意:
1.<merge />只可以作為xml layout的根節點。
2.當需要擴充的xml layout本身是由merge作為根節點的話,需要將被導入的xml layout置於 viewGroup中,同時需要設置attachToRoot為True。