Android里merge和include标签的使用

转载 2011年12月27日 14:47:24

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.   <include android:id="@+id/cell1" layout="@layout/workspace_screen" />   
  7.   <include android:id="@+id/cell2" layout="@layout/workspace_screen" />    
  8.   <include android:id="@+id/cell3"layout="@layout/workspace_screen" />  
  9. </com.android.launcher.Workspace>  

 

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

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

在Android layout文件中需要一个顶级容器来容纳其他的组件,而不能直接放置多个组件,例如如下的代码:
  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent">  
  4.   
  5.     <ImageView  
  6.         android:layout_width="fill_parent"  
  7.         android:layout_height="fill_parent"   
  8.         android:scaleType="center"  
  9.         android:src="@drawable/golden_gate" />  
  10.   
  11.     <TextView  
  12.         android:layout_width="wrap_content"  
  13.         android:layout_height="wrap_content"  
  14.         android:text="Golden Gate" />  
  15.   
  16. </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. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent">  
  4.   
  5.     <ImageView  
  6.         android:layout_width="fill_parent"  
  7.         android:layout_height="fill_parent"   
  8.   
  9.         android:scaleType="center"  
  10.         android:src="@drawable/golden_gate" />  
  11.   
  12.     <TextView  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_marginBottom="20dip"  
  16.         android:layout_gravity="center_horizontal|bottom"  
  17.   
  18.         android:padding="12dip"  
  19.   
  20.         android:background="#AA000000"  
  21.         android:textColor="#ffffffff"  
  22.   
  23.         android:text="Golden Gate" />  
  24.   
  25. </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. <merge xmlns:android="http://schemas.android.com/apk/res/android">  
  2.   
  3.     <ImageView  
  4.         android:layout_width="fill_parent"  
  5.         android:layout_height="fill_parent"   
  6.   
  7.         android:scaleType="center"  
  8.         android:src="@drawable/golden_gate" />  
  9.   
  10.     <TextView  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content"  
  13.         android:layout_marginBottom="20dip"  
  14.         android:layout_gravity="center_horizontal|bottom"  
  15.   
  16.         android:padding="12dip"  
  17.   
  18.         android:background="#AA000000"  
  19.         android:textColor="#ffffffff"  
  20.   
  21.         android:text="Golden Gate" />  
  22.   
  23. </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()文档)

如何让VC只输出汇编代码?

如何让VC只输出汇编代码?让VC只输出汇编代码十分简单,只要加入下面这个参数就可以了。cl /FA test.cpp这样生成出来的就是汇编代码。如何使ESC键对于对话框无效?完成要求的功能可以有两种方...
  • wxyxl
  • wxyxl
  • 2001-05-04 14:06:00
  • 829

Android布局优化 之 <merge>标签使用详解

1.为什么要使用 2.什么情况下使用 3.如何使用
  • xiaoyinliuyun
  • xiaoyinliuyun
  • 2017-06-20 09:44:06
  • 3736

Android 布局优化之include与merge

官方提供了三个用来优化布局的标签,分别是include、merge与ViewStub,其中ViewStub是动态加载视图到内存,大家可以查阅:Android UI布局优化之ViewStub 一、inc...
  • a740169405
  • a740169405
  • 2016-01-15 11:30:26
  • 13157

Android抽象布局——include、merge 、ViewStub

在布局优化中,Androi的官方提到了这三种布局、、,并介绍了这三种布局各有的优势,布局重用,减少视图层级,需要时加载。...
  • xyz_lmn
  • xyz_lmn
  • 2013-11-11 17:18:35
  • 129476

android布局优化之<merge>标签的使用

学习android知识,却经常忘记,是应该把知识总结为文字. -2017年6月21日07:51:19 1,标签的作用 标签用于减少View树的层次来优化Android的布局. 2,标签怎么用 3,...
  • willway_wang
  • willway_wang
  • 2017-06-21 07:46:46
  • 224

Android布局优化之<merge>与<ViewStub>标签使用

merge标签:使用merge标签可以达到减少布局层级的作用,特别在配合include标签进行使用的时候,通过减少布局的层级数,可以优化APP在加载布局文件时的资源消耗,从而达到提高APP性能的效果。...
  • u011771755
  • u011771755
  • 2015-09-21 15:54:33
  • 1584

【Android】Merge讲解与实例

【Android】Merge讲解与实例 转自 单独将标签做个介绍,是因为它在优化UI结构时起到很重要的作用。目的是通过删减多余或者额外的层级,从而优化整个Android Layout的结构。核心功...
  • dabinkaoyan
  • dabinkaoyan
  • 2015-08-13 12:48:04
  • 1102

Android 布局优化(merge使用)

目的:减少布局层数 效果:减少视图树中的节点个数,加快视图的绘制,提高UI性能#何时使用: 子视图不需要指定任何针对父视图的布局属性 假如需要在LinearLayout里面嵌入一个布局(或者视图),...
  • yeyuyyy
  • yeyuyyy
  • 2016-11-17 18:04:41
  • 473

android之merge布局

标签闪亮登场了。当LayoutInflater遇到这个标签时,它会跳过它,并将内的元素添加到的父元素里。迷惑了吗?让我们用来替换FrameLayout,并重写之前的XML布局:         ...
  • scyatcs
  • scyatcs
  • 2015-03-12 10:22:06
  • 1299

Android性能优化——<merge>标签

昨天小米5发布(cpu 高通骁龙820,RAM 4GB)现在的工业水平来看 内存跟性能足够高了。。。作为开发者来讲 我们做的应用 要极致,要优雅。Merge 标签用于减少View树的层次来优化Andr...
  • sinat_15877283
  • sinat_15877283
  • 2016-02-26 00:13:54
  • 760
收藏助手
不良信息举报
您举报文章:Android里merge和include标签的使用
举报原因:
原因补充:

(最多只允许输入30个字)