http://apps.hi.baidu.com/share/detail/17758698

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

<com.android.launcher.Workspace  android:id="@+id/workspace"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  launcher:defaultScreen="1">  <include android:id="@+id/cell1" layout="@layout/workspace_screen" />  <include android:id="@+id/cell2" layout="@layout/workspace_screen" />  <include android:id="@+id/cell3" layout="@layout/workspace_screen" /></com.android.launcher.Workspace>

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

<include android:layout_width="fill_parent" layout="@layout/image_holder" /><include android:layout_width="256dip" layout="@layout/image_holder" />使用<merge /> 标签来减少视图层级结构在Android layout文件中需要一个顶级容器来容纳其他的组件,而不能直接放置多个组件,例如如下的代码:

<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/golden_gate" />

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Golden Gate" />

</FrameLayout>


单独将<merge />标签做个介绍,是因为它在优化UI结构时起到很重要的作用。目的是通过删减多余或者额外的层级,从而优化整个Android Layout的结构。

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

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

<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/golden_gate" />    <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 Gate" /></FrameLayout>

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

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

标签_第1张图片" src="https://img.it610.com/image/info5/92a816f27e10456c9a3f0471539141af.jpg" width="133" style="border-right:#e6e6e6 4px solid; border-top:#e6e6e6 4px solid; border-left:#e6e6e6 4px solid; border-bottom:#e6e6e6 4px solid;border:1px solid black;">

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

<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/golden_gate" />    <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 Gate" /></merge>

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

标签_第2张图片" src="https://img.it610.com/image/info5/c24c642cbdfc4ee09bf316d1601c0593.jpg" width="133" style="border-right:#e6e6e6 4px solid; border-top:#e6e6e6 4px solid; border-left:#e6e6e6 4px solid; border-bottom:#e6e6e6 4px solid;border:1px solid black;">

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

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

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

  • <merge />只可以作为xml layout的根节点。
  • 当需要扩充的xml layout本身是由merge作为根节点的话,需要将被导入的xml layout置于 viewGroup中,同时需要设置attachToRoot为True。(更多说明请参见inflate()文档)

更多相关文章

  1. 为Android应用程序读取/dev下设备而提权(二)
  2. UiAutomator通过ant实现快速调试
  3. Android(安卓)IO流使用详解-SDcard
  4. Android(安卓)NFC 应用程序记录ARR
  5. Android开发——了解android项目目录结构
  6. Android(安卓)NFC技术(三)——初次开发Android(安卓)NFC你须知道Nd
  7. Android(安卓)Exported service does not require permission警
  8. Android之Merge及自定义属性attrs.xml使用
  9. Android实现滑动标签页

随机推荐

  1. Android(安卓)Studio 我的快捷键
  2. Android(安卓)SQLite增删改查的语句
  3. Android知识点总结
  4. 【AS环境】mac上配置adb环境
  5. Android(安卓)弹性布局 FlexboxLayout了
  6. android中 jar包 方法数统计
  7. 如何解决软键盘弹出引起的各种不适
  8. Android(安卓)Touch事件分发过程
  9. Android(安卓)mediaplayer学习笔记
  10. Android命令行工具AAPT2