Android开发技巧之ViewStub控件惰性装载

 更新时间:2013年01月22日 10:19:30   作者:  
布局文件中的控件并不一定在程序启动时全都用到,有一些控件只在特定的情况下才会被使用到;我们急需一种机制来改变<include>标签的这种行为,只在需要时装载控件。这种机制就是本节要介绍的ViewStub控件
在4.5.6节介绍过一个<include>标签,该标签可以在布局文件中引用另外一个布局文件,并可以覆盖被引用布局文件根节点所有与布局相关的属性,也就是以android:layout开头的属性。通过<include>标签可以将一个非常庞大的布局文件分解成若干个较小的布局文件,而且这些小的布局文件也可以被多次引用,从而达到一个重用的目的。

<include>标签固然很好用,但有一个问题,就是布局文件中的控件并不一定在程序启动时全都用到,有一些控件只在特定的情况下才会被使用到。例如,一个阅读图书的软件只有在下载电子书时才需要显示进度条,在平时看书时都是装载的本地电子书,并不需要使用进度条。因此,在程序启动时完全可以先不加载这个进度条。但使用<include>标签引用这个包含进度条的布局文件时,不管三七二十一,将所有的控件全部装载到了内存中。也许有的读者会说,一个进度条占用不了多少系统资源,都装载也无所谓。这些读者也许是对的,但如果装载的不是进度条,而是很多ImageView控件(显示了很大的图像),并且还不是在一个地方装载,那恐怕就会将可怜的手机资源消耗殆尽了。因此,我们急需一种机制来改变<include>标签的这种行为,只在需要时装载控件。这种机制就是本节要介绍的ViewStub控件。

ViewStub是不可视的控件,它的作用与<include>标签基本相同,在布局文件中使用<ViewStub>标签来引用其他的布局文件。但与<include>唯一的不同是ViewStub并不会马上装载引用的布局文件。只有在调用了ViewStub.inflate或ViewStub.setVisibility(View.VISIBLE)方法后,ViewStub才会装载引用的控件,下面先看两个布局文件。
main.xml
复制代码 代码如下:

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Buttonandroid:layout_width="fill_parent"
android:layout_height="wrap_content"android:text="我的按钮"
android:onClick="onClick_Button"/>
<includelayout="@layout/custom"/>
</LinearLayout>

custom.xml
复制代码 代码如下:

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Buttonandroid:layout_width="fill_parent"
android:layout_height="wrap_content"android:text="按钮1"/>
<Buttonandroid:layout_width="fill_parent"
android:layout_height="wrap_content"android:text="按钮2"/>
</LinearLayout>

在main.xml文件中使用了<include>标签来引用custom.xml,在这种情况下,屏幕上会立即显示三个如图5.56所示的按钮。如果将<include>标签换成如下的代码,在程序启动时,只会显示在main.xml文件中的定义按钮,如图5.57所示。
复制代码 代码如下:

<ViewStubandroid:id="@+id/viewstub"android:inflatedId="@+id/button_layout"
android:layout="@layout/custom"android:layout_width="fill_parent"
android:layout_height="wrap_content"/>


              图5.56  使用<include>标签装载控件


图5.56使用<ViewStub>标签装载控件
在使用<ViewStub>标签引用布局文件后,还需要调用ViewStub.inflate或ViewStub.setVisibility(View.VISIBLE)方法才能装载所引用的控件,代码如下:
复制代码 代码如下:

publicvoidonClick_Button(Viewv)
{
//ViesStub控件只能获得一次,第二次再使用findViewById获得该ViewStub对象,则返回null
Viewview=findViewById(R.id.viewstub);
if(view!=null)
{
//或调用ViewStub.inflate方法
//view=((ViewStub)view).inflate();
//装载ViewStub引用的custom.xml文件中的控件
((ViewStub)view).setVisibility(View.VISIBLE);
}
else
{
setTitle("viewisnull");
}
}

单击“我的按钮”后,会显示在custom.xml文件中定义的两个按钮,效果与图5.56完全一样。
注意:<ViewStub>与<include>标签一样,也可以设置所引用布局文件中根节点所有与布局相关的属性。所不同的是<include>标签的android:id属性直接覆盖了所引用布局文件中根节点的android:id属性值,而<ViewStub>标签的android:id属性与普通控件标签的android:id属性一样,用于在代码中引用控件。在<ViewStub>标签中需要使用android:inflatedId属性覆盖所引用布局文件中根节点的android:id属性值。虽然<ViewStub>可完全取代<include>,但唯一的不足是<ViewStub>目前还无法取代<merge>。

相关文章

  • Android wifi 调试详解及简单实例

    Android wifi 调试详解及简单实例

    这篇文章主要介绍了Android wifi 调试详解及简单实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • Android调用系统裁剪的实现方法

    Android调用系统裁剪的实现方法

    下面小编就为大家分享一篇Android调用系统裁剪的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • android串口开发入门之搭建ndk开发环境及第一个jni调用程序

    android串口开发入门之搭建ndk开发环境及第一个jni调用程序

    这篇文章主要给大家介绍了关于android串口开发入门之搭建ndk开发环境及第一个jni调用程序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Android自定义View圆形进度条控件(三)

    Android自定义View圆形进度条控件(三)

    这篇文章主要为大家详细介绍了Android自定义View圆形进度条控件的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android开发实现带清空按钮的EditText示例

    Android开发实现带清空按钮的EditText示例

    这篇文章主要介绍了Android开发实现带清空按钮的EditText,结合具体实例形式分析了Android实现EditText清空按钮功能相关操作技巧,非常具有实用价值,需要的朋友可以参考下
    2017-11-11
  • Android 添加TextView删除线(代码简单)

    Android 添加TextView删除线(代码简单)

    最近接了个项目,其中有项目需求是这样的,有这么个需求,就是一个产品下有两个价格,一个是市场价,一个是销售价,这时要把市场价添加个删除线;怎么实现呢?下面小编给大家分享一段简单的代码实现Android 添加TextView删除线
    2016-02-02
  • android webview获取html代码和根据id获取value实例

    android webview获取html代码和根据id获取value实例

    这篇文章主要介绍了android webview获取html代码和根据id获取value实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android即时通讯设计(腾讯IM接入和WebSocket接入)

    Android即时通讯设计(腾讯IM接入和WebSocket接入)

    本文主要介绍了Android即时通讯设计(腾讯IM接入和WebSocket接入),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • android实现NFC读写功能

    android实现NFC读写功能

    这篇文章主要为大家详细介绍了android实现NFC读写功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 详解Android的.aar文件生成方法以及使用技巧

    详解Android的.aar文件生成方法以及使用技巧

    给大家详细分析一下在Android中关于.aar文件生成的方法以及相关是使用技巧分析,需要的朋友学习参考下吧。
    2017-12-12

最新评论