ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。
1优点
ViewStub,惰性装载控件。ViewStub是一个无形的、零大小的视图,可以在程序运行的过程中,通过懒加载的模式inflate进布局资源中。当一个ViewStub的inflate()方法被调用或者被设为显示时,这个ViewStub使用设定的View才会被加载,并替换当前ViewStub的位置。因此,ViewStub存在于视图层次,直到setVisibility(int)或inflate()方法被调用,否则是不加载控件的,所以消耗的资源小。通常也叫它为“懒惰的include”。
2基础练习
不错的讲ViewStub基础的博文
这里将博文里强调的问题,再唠叨一遍咯:
使用的时候的注意事项:
. 某些布局属性要加在ViewStub而不是实际的布局上面,才会起作用,比如上面用的android:layout_margin*系列属性,如果加在TextView上面,则不会起作用,需要放在它的ViewStub上面才会起作用。而ViewStub的属性在inflate()后会都传给相应的布局。
3属性
<ViewStub
android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
id:可以找到此viewStub控件
inflatedId:当控件inflate之后,可以通过这个inflatedId找到其layout。
layout:inflate之后,将原viewStub移除,获得layout布局。
注:
1.View inflated = stub.inflate();//inflate返回的是view
2.加载view之后,viewstub本身就会被新加载进来的view替换掉
官方解释:When inflate() is invoked, the ViewStub is replaced by the inflated View and the inflated View is returned. This lets applications get a reference to the inflated View without executing an extra findViewById().
4 监听事件
对于ViewStub而言,它需要监听的事件就只有一个,被加载的时候触发的事件VIewStub.OnInflate