在分析Android6.0源码时碰到以下一个布局
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent"/> <ViewStub android:id="@+id/empty" android:layout="@layout/no_transfers" android:layout_width="fill_parent" android:layout_height="fill_parent"/> </merge>
我一直认为分析一个原生控件的最好办法就是查看源码以及demo演示,所以先看下ViewStub源码中的说明
根据源码可以获得以下信息
1,ViewStub继承自View
2,ViewStub默认是不可见(invisible)的,而且View的size为zero,即大小为0的view,用来在运行期间(runtime)加载布局
3,当一个ViewStub被设置成可见visible或者调用inflate()方法时,ViewStub得到填充,此时viewstub所引用的layout布局会代替掉viewstub控件显示出来,也就是说在调用setVisible(int)或者inflate()方法之前,UI中只有一个大小为0的viewstub。这对于布局的动态加载很有帮助
以上三点主要是总结来说就是viewstub默认不可见,在对布局进行加载时viewstub大小为0不占用任何的空间,当开发者在运行期间想让其动态显示时可以调用inflate()方法或者setVisible(int)来动态的加载布局,看到这里不得不佩服源码之强大,自己之不足。
关于ViewStub的用法,源码上已有介绍
<ViewStub android:id="@+id/stub" android:inflatedId="@+id/subTree" android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />
在代码中通过id获取到对ViewStub的引用,然后调用inflate方法,调用该方法后mySubTree布局会代替ViewStub。ViewStub会被从它的parent中移除.通过inflateID:subTree可以在代码中引用到mySubTree
ViewStub stub = (ViewStub) findViewById(R.id.stub); View inflated = stub.inflate();