将经过一个例子来了解这个标签实际所产生的做用,这样能够更直观的了解<merge/>的用法。java
创建一个简单的Layout,其中包含两个Views元素:ImageView和TextView 默认状态下咱们将这两个元素放在FrameLayout中。其效果是在主视图中全屏显示一张图片,以后将标题显示在图片上,并位于视图的下方。如下是xml代码:android
<?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 />标签来处理相似的问题了。spa
这里能够提醒你们在开发工程中能够习惯性的经过hierarchyViewer查看当前UI资源的分配状况。 Hierarchy Viewer是随AndroidSDK发布的工具,位置在tools文件夹下,名为hierarchyviewer.bat。它是Android自带的很是有用并且使用简单的工具,能够帮助咱们更好地检视和设计用户界面(UI),绝对是UI检视的利器。具体能够看这篇文章 Android工具Hierarchy Viewer.net
咱们将上边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结构图:code
运行程序后在Emulator中显示的效果是同样的,但是经过hierarchyviewer查看的UI结构是有变化的,当初多余的FrameLayout节点被合并在一块儿了,或者能够理解为将merge标签中的子集直接加到Activity的FrameLayout跟节点下(这里须要提醒你们注意:全部的Activity视图的根节点都是frameLayout)。若是你所建立的Layout并非用framLayout做为根节点(而是应用LinerLayout等定义root标签),就不能应用上边的例子经过merge来优化UI结构。xml
除了上边的例子外,meger还有另一个用法,当应用Include或者ViewStub标签从外部导入xml结构时,能够将被导入的xml用merge做为根节点表示,这样当被嵌入父级结构中后能够很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。blog
另外有两点须要特别注意:
1.<merge />只能够做为xml layout的根节点。
2.当须要扩充的xml layout自己是由merge做为根节点的话,须要将被导入的xml layout置于 viewGroup中,同时须要设置attachToRoot为True。