标签:
ViewStub控件是一个不可见,0尺寸得惰性控件。当ViewStub控件设置可见,或者调用inflate(),并执行完成之后,ViewStub所指定的layout资源就会被加载。这个ViewStub就会被新加载的layout文件代替。ViewStub也会从其父控件中移除。因此ViewStub存在view Hierarchy中的生存期为直到ViewStub执行了setVisable(int)或者inflate()方法。
在setVisable或者inflate方法执行完毕,被加载的Layout文件伴随着ViewStub的属性设置一起被加入ViewStub的父控件中。
你可以定义或者重写被加载layout文件的id属性。例如:
<ViewStub android:id="@+id/stub" android:inflatedId="@+id/subTree" android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />
这个定义的ViewStub控件可以通过设定的id“stub”找到,在成功获取subTree制定的kayout之后,ViewStub就从其父控件中移除了,被加载的mySubTree,可以通过id“subTree”找到。从以上的代码属性设置来说,最终加载的Layout文件,会以宽120dp,高40dp展示。
通过以下方式,可以使ViewStub展示出其所代表的layout文件。
ViewStub stub = (ViewStub) findViewById(R.id.stub); View inflated = stub.inflate();
当inflate()执行完成,Viewstub就被替换掉了,inflate返回的View就是mySubTree这个布局文件的View。所以就不需要执行额外的findById了。
值得注意的是:ViewStub在Api1的时候就已经提供了,但是在api16的时候,增加了一个方法:
public void setLayoutInflater (LayoutInflater inflater)
这个方法解决了,不能指定LayoutInflater 的问题,这涉及了Context的使用。
如果你在低于Api16的开发中,遇到找到不你加载View 的 id的情况,那多数情况是,Context出了问题。在低于api16的情况下,解决方式有两种:
(1)自定义ViewStub
(2)在V7包中,使用ViewStubCompat类。
作者有话说:如果你需要或者Android中文API,请扫一扫下面的二维码,您的关注,就是我的动力。
标签:
原文地址:http://blog.csdn.net/nefuyang/article/details/51221986