android中的惰性加载方式:ViewStub

DouglasEman 9年前

来自: http://www.jcodecraeer.com//a/anzhuokaifa/androidkaifa/2014/0821/1658.html


   大家都应知道<include>标签,该标签可以在布局文件中引用另外一个布局文件,并可以覆盖被引用布局文件根节点所有与布局相关的属性,也就是以android:layout开头的属性。通过<include>标签可以将一个非常庞大的布局文件分解成若干个较小的布局文件,而且这些小的布局文件也可以被多次引用,从而达到一个重用的目的。

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

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

   ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。

   首先来说说ViewStub的一些特点:

1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。

2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。

在很多应用中,当用户第一次进入会有一些由ImageView显示的操作提示,每次用户只能看一步提示,然后是下一步,这种场景下就很适合用ViewStub来实现。

最后,ViewStub的使用demo:

https://github.com/sodino/ViewStubDemo