当布局结构过于复杂,包含很多ViewGroup和view控件。这样就导致View树的层次越来越深,当程序一下子加载这么复杂的布局的时,所花费的时间会很多。既然有问题,那么肯定会有对应得解决办法。可以使用ViewStub来延迟加载某些视图资源,让其他一些重要的视图先加载出来。
ViewStub是一个不可见的,大小为0的view,它可以用于在运行时动态的加载layout资源。当ViewStub被设置为可见状态,或者它的inflate方法被调用,ViewStub中的layout资源文件就会被加载。它将用加载的layout来替换自己原来的位置。因此,一旦ViewSutb调用setVisibility(
参数为INVISIBLE或者VISIBLE)或者inflate方法,ViewStub就会从它原来所在的视图阶层中消失,随之的就是加载的视图被放置在ViewStub原来的位置,而这加载的视图也将会继承ViewStub原来的layout
parameters。(以上纯属笔者翻译,如有错误,敬请指正,谢谢)
官网还给我们举了一个小例子,如下:
<ViewStubandroid:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
然后也给出了具体调用的java代码:
ViewStub stub =(ViewStub)findViewById(R.id.stub);
View inflated = stub.inflate();
一旦inflate被调用,该stub就会被加载的view(在这里是id是subTree,我们可以通过findviewbyid来找到加载的view)替换掉,该方法会返回加载的view的引用,所以我们不需要在通过findviewbyid来找该view了。
通过学习该api文档,发现官网描述的ViewStub的用法非常简单,非常方便动态地加载和隐藏layout资源。常用于layout视图层次比较复杂的情况,这种情况下,可以让activity界面较快的能显示出来,等界面呈现之后,在加载剩余的stub对应的视图。