Android里merge和include标签的使用

本文详细介绍了在Android开发中如何利用include和merge标签优化布局代码,减少重复和提高代码复用率。通过实例展示了如何在不改变整体布局效果的前提下,减少视图层级结构,提升UI性能。

1.使用<include /> 标签来重用layout代码

如果在一个项目中需要用到相同的布局设计,可以通过<include /> 标签来重用layout代码,该标签在android开发文档中没有相关的介绍。在android主屏程序中用到了这个标签:

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. <com.android.launcher.Workspace
  2. android:id="@+id/workspace"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. launcher:defaultScreen="1">
  6. <includeandroid:id="@+id/cell1"layout="@layout/workspace_screen"/>
  7. <includeandroid:id="@+id/cell2"layout="@layout/workspace_screen"/>
  8. <includeandroid:id="@+id/cell3"layout="@layout/workspace_screen"/>
  9. </com.android.launcher.Workspace>

这样可以多次引用一个布局片段而不用重复的复制、粘贴。通过include标签也可以覆写一些属性的值,例如上面的示例就覆写了引用的layout中的id值。下面是另外一个示例:


  1. <includeandroid:layout_width="fill_parent"layout="@layout/image_holder"/>
  2. <includeandroid:layout_width="256dip"layout="@layout/image_holder"/>
2.使用<merge /> 标签来减少视图层级结构

在Android layout文件中需要一个顶级容器来容纳其他的组件,而不能直接放置多个组件,例如如下的代码:
  1. <FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent">
  4. <ImageView
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. android:scaleType="center"
  8. android:src="@drawable/golden_gate"/>
  9. <TextView
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:text="GoldenGate"/>
  13. </FrameLayout>
单独将<merge />标签做个介绍,是因为它在优化UI结构时起到很重要的作用。目的是通过删减多余或者额外的层级,从而优化整个Android Layout的结构。

3.将通过一个例子来了解这个标签实际所产生的作用,这样可以更直观的了解<merge/>的用法。

建立一个简单的Layout,其中包含两个Views元素:ImageViewTextView默认状态下我们将这两个元素放在FrameLayout中。其效果是在主视图中全屏显示一张图片,之后将标题显示在图片上,并位于视图的下方。以下是xml代码:

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. <FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent">
  4. <ImageView
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. android:scaleType="center"
  8. android:src="@drawable/golden_gate"/>
  9. <TextView
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:layout_marginBottom="20dip"
  13. android:layout_gravity="center_horizontal|bottom"
  14. android:padding="12dip"
  15. android:background="#AA000000"
  16. android:textColor="#ffffffff"
  17. android:text="GoldenGate"/>
  18. </FrameLayout>

应用上边的Layout运行的视图为:

layouttutorial_merge_01

启动 tools> hierarchyviewer.bat工具查看当前UI结构视图:

layouttutorial_merge_02

我们可以很明显的看到由红色线框所包含的结构出现了两个framelayout节点,很明显这两个完全意义相同的节点造成了资源浪费(这里可以提醒大家在开发工程中可以习惯性的通过hierarchyViewer查看当前UI资源的分配情况),那么如何才能解决这种问题呢(就当前例子是如何去掉多余的frameLayout节点)?这时候就要用到<merge />标签来处理类似的问题了。我们将上边xml代码中的framLayout替换成merge:

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. <mergexmlns:android="http://schemas.android.com/apk/res/android">
  2. <ImageView
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:scaleType="center"
  6. android:src="@drawable/golden_gate"/>
  7. <TextView
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_marginBottom="20dip"
  11. android:layout_gravity="center_horizontal|bottom"
  12. android:padding="12dip"
  13. android:background="#AA000000"
  14. android:textColor="#ffffffff"
  15. android:text="GoldenGate"/>
  16. </merge>

运行程序后在Emulator中显示的效果是一样的,可是通过hierarchyviewer查看的UI结构是有变化的,当初多余的FrameLayout节点被合并在一起了,或者可以理解为将merge标签中的子集直接加到Activity的FrameLayout跟节点下(这里需要提醒大家注意:所有的Activity视图的根节点都是frameLayout)。如果你所创建的Layout并不是用framLayout作为根节点(而是应用LinerLayout等定义root标签),就不能应用上边的例子通过merge来优化UI结构。

layouttutorial_merge_03

4.除了上边的例子外,meger还有另外一个用法

当应用Include或者ViewStub标签从外部导入xml结构时,可以将被导入的xml用merge作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。

另外有两点需要特别注意:

  • <merge />只可以作为xml layout的根节点。
  • 当需要扩充的xml layout本身是由merge作为根节点的话,需要将被导入的xml layout置于 viewGroup中,同时需要设置attachToRoot为True。(更多说明请参见inflate()文档)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值