在分析Android6.0源码时碰到如下一个布局 [java] view plain copy 在CODE上查看代码片派生到个人代码片 <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>java
在布局中用到了一个叫作ViewStub的view,不甚理解, 我一直认为分析一个原生控件的最好办法就是查看源码以及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)来动态的加载布局,看到这里不得不佩服源码之强大,本身之不足。android
关于ViewStub的用法,源码上已有介绍 [java] view plain copy 在CODE上查看代码片派生到个人代码片 <ViewStub android:id="@+id/stub" android:inflatedId="@+id/subTree" android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />布局
其用法其实相似include,其中android:layout属性用来引用所要动态加载的布局,经过id能够对ViewStub在代码中进行引用 在代码中经过id获取到对ViewStub的引用,而后调用inflate方法,调用该方法后mySubTree布局会代替ViewStub。ViewStub会被从它的parent中移除.经过inflateID:subTree能够在代码中引用到mySubTree [java] view plain copy 在CODE上查看代码片派生到个人代码片 ViewStub stub = (ViewStub) findViewById(R.id.stub);
View inflated = stub.inflate();xml