android开发当中,我们经常会遇到根据某个条件去控制一个控件的显示/隐藏的情况。虽然setVisibility(int visibility)的确可以达到这样的目的,但是在渲染时,其实隐藏的布局也会执行inflate()方法,造成额外的资源开支(内存),针对这种情况更好的做法就是使用ViewStub这个对象。
根据官网上的描述,ViewStub是一个不可见的(invisible),不占任何空间(zero-sized)的可以用来延时渲染的View对象。我们在布局中可以给他设定layout参数,指定想要替换的布局文件。当我们调用ViewStub的inflate() 或者 setVisibility()方法时,ViewStub将被指定的layout所替代,并且新的view将继承该ViewStub的布局参数。
简单的示例:
<ViewStub android:id="@+id/stub" android:inflatedId="@+id/subTree" android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />
布局中,mySubTree就是我们想要延时渲染的视图。在我们调用inflate()方法后,新渲染的视图会继承ViewStub的布局参数,即,mySubTree这个布局的实际宽高将分别是120dp和40dp。新渲染的视图id将是我们指定的 subTree(对应上面布局中的inflatedId="@+id/subTree")
实际上也没必要再去调用findViewById(int),官方推荐的做法是
ViewStub stub = (ViewStub) findViewById(R.id.stub); View inflated = stub.inflate();
inflated就是我们新生成的视图对象。
我们也可以通过setInlfateListener(ViewStub.onInflateListener listener)绑定监听器, 在渲染完成时通过回调对该view进行一些操作。(比如显示指定数据?)