`
liangoogle
  • 浏览: 279570 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android Layout标签之-viewStub,requestFocus,merge,include

阅读更多

定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, <merge /> and<include />。可是以往我们所接触的案例或者官方文档的例子都没有着重去介绍这些标签的重要性。

  • <viewStub  />: 此标签可以使UI在特殊情况下,直观效果类似于设置View的不可见性,但是其更大的(R)意义在于被这个标签所包裹的Views在默认状态下不会占用任何内存空间。viewStub通过include从外部导入Views元素。
    • 用法:通过android:layout来指定所包含的内容。默认情况下,ViewStub所包含的标签都属于visibility=GONE。viewStub通过方法inflate()来召唤系统加载其内部的Views。
      <ViewStub android:id="@+id/stub"
      android:inflatedId="@+id/subTree"
      android:layout="@layout/mySubTree"
      android:layout_width="120dip"
      android:layout_height="40dip" />
  • <include />:可以通过这个标签直接加载外部的xml到当前结构中,是复用UI资源的常用标签。
    • 用法:将需要复用xml文件路径赋予include标签的Layout属性。
      <include android:id="@+id/cell1" layout="@layout/ar01" />
      <include android:layout_width="fill_parent" layout="@layout/ar02" />
  • <requestFocus />: 标签用于指定屏幕内的焦点View。
    • 用法: 将标签置于Views标签内部 <!– Easy AdSenser V2.37 –><!– Post[count: 2] –>
      <EditText id="@+id/text"
                   android:layout_width="fill_parent"
                   android:layout_height="wrap_content"
                   android:layout_weight="0"
                   android:paddingBottom="4">
             <requestFocus />
      </EditText>
  • <merge />:
  • 单独将<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结构视图:

layouttutorial_merge_01

layouttutorial_merge_02

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

<!– Easy AdSenser V2.37 –><!– Post[count: 2] –>

<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结构。

layouttutorial_merge_03

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

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

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

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

    相关推荐

      Android布局技巧之include、merge与ViewStub标签的巧用

      Android官方提供了一些工具来优化布局管理,包括`include`、`merge`和`ViewStub`标签。这三个标签分别在不同的场景下发挥着重要作用,提高了代码的可读性和效率。 ### 1. `include`标签 `include`标签允许开发者将...

      Android UI优化之ViewStub标签的使用

      3. `android:layout_width`和`android:layout_height`:通常设置为"0dp",因为ViewStub在加载前不占用任何空间。 4. `android:visibility`:默认为"GONE",意味着ViewStub在加载前始终不可见。 **三、ViewStub的...

      android layout merge

      在Android开发中,布局(Layout)是构建用户界面的关键元素,而`merge`布局是一种优化UI性能和提高代码可读性的特殊技术。本篇文章将深入探讨`merge`布局的使用,以及它如何与Genymotion模拟器关联。 `merge`布局在...

      ListView之ViewStub的使用

      - ViewStub有两个关键属性:`android:layout`和`android:inflatedId`,分别用于指定要加载的布局资源ID和加载后视图的ID。 2. **在ListView中使用ViewStub** - 当ListView项需要根据特定条件显示或隐藏某些复杂...

      Android UI 优化之merge标签的使用

      - 当merge作为`&lt;include&gt;`的子元素时,`&lt;include&gt;`的属性(如`android:layout_width`、`android:layout_height`)将应用于merge的子视图,而不是merge本身。 - 为了避免混淆,避免在同一个布局文件中同时使用merge和...

      DataBinding中ViewStub例子

      在DataBinding中使用ViewStub,首先需要在XML布局文件中定义ViewStub,并设置`android:layout`属性来指定要加载的子布局资源。例如: ```xml &lt;layout xmlns:android="http://schemas.android.com/apk/res/android"&gt;...

      HowTo-ViewStub:ViewStub 元素的 Hello world

      在`HowTo-ViewStub-master`这个项目中,你应该能看到一个简单的例子,演示了如何创建和使用ViewStub。项目可能包含一个主布局文件,其中包含一个ViewStub,以及一个被延迟加载的子布局文件。通过运行这个项目,你...

      ViewStub的使用简单示例

      2. `android:layout_width`和`android:layout_height`:通常设置为`0dp`,因为ViewStub在初始化时不占用任何空间。 3. `android:inflatedId`:设置ViewStub在被加载后所生成视图的ID,如果未指定,将自动生成一个。 ...

      UI_include_merge_ViewStub

      `UI_include_merge_ViewStub` 这个主题主要涉及到了三个关键概念:`&lt;include&gt;`标签、`&lt;merge&gt;`标签和`ViewStub`组件。这些元素在构建高效且可维护的布局文件时起着重要作用。 首先,我们来详细了解一下`&lt;include&gt;`...

      Android下使用ViewStub控件加载

      标签"android"表明这是与Android平台相关的技术,"ViewStub"是本文的核心话题,而"include"则可能暗示了ViewStub可以与&lt;include&gt;标签配合使用,实现布局的复用和组合。在Android布局中,&lt;include&gt;标签可以将一个布局...

      Android在layout xml中使用ViewStub完成动态加载问题

      Android 在 layout xml 中使用 ViewStub 完成动态加载问题 Android 中的动态加载问题是指在应用程序中根据不同的条件来决定显示哪个 View 或某个布局的问题。在 Android 中,通常的做法是把可能用到的 View 都写在...

      第三章 Android开发 使用ViewStub延迟展开视图.docx

      - `android:layout_width`和`android:layout_height`: 设置ViewStub的宽度和高度,通常设置为`fill_parent`或`wrap_content`。 - `android:layout_gravity`(可选): 如果父视图是格子布局(如LinearLayout),则...

      android-collapse-calendar-view-Android.zip

      "android-collapse-calendar-view-Android.zip" 提供了一个独特的日历视图控件,它结合了月视图和周视图,为用户提供了灵活的查看方式。这个控件的设计既简约又炫酷,可以显著提升应用程序的视觉吸引力。下面我们将...

      Android布局技巧之使用ViewStub

      4. `android:layout_width` 和 `android:layout_height`:设置`ViewStub`的宽度和高度,通常设为`match_parent`或`wrap_content`。 5. 其他布局参数(如`layout_gravity`):这些参数会传递给加载后的布局。 以下是...

      android layout demo

      - 使用`merge`标签来减少布局层级,提高性能。 - 利用`android:layout_weight`属性实现动态比例分配空间。 - 使用`ViewGroup`的`removeView()`方法移除不再需要的视图。 5. **Android Studio工具**: - Android...

      Android开发之merge结合include优化布局

      merge结合include优化android布局,效果不知道,个人感觉使用上也有很大的局限,不过还是了解一下,记录下来。 布局文件都要有根节点,但android中的布局嵌套过多会造成性能问题,于是在使用include嵌套的时候我们...

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

      在Android开发中,为了提高代码复用性和优化布局性能,Android提供了三种特殊的抽象布局:`&lt;include/&gt;`、`&lt;merge/&gt;` 和 `&lt;ViewStub/&gt;`。这些布局元素都有各自的特性和用途,使得开发者能够更好地管理和优化应用的...

    Global site tag (gtag.js) - Google Analytics