周末在家,没有办法写demo,当然也没办法测试,只能通过源码直接分析。网上找了一个源码库,分享给大家
链接:http://repository.grepcode.com/java/ext/
简介
ViewStub是一个用来延迟初始化的View的类。适用于那些Views布局复杂,或者加载比较耗时的情况,延迟初始化可以优化用户体验。
官方解释的理解
ViewStub是不可见的,0像素View,被用来在运行时推迟填充layout资源。
ViewStub调用setVisibility(View.VISIBLE)或inflate()后,会触发inflated layout被初始化。,ViewStub本身会被removed掉,inflated Layout会添加到parent layout中。
注意,inflatedlayout会使用ViewStub的layoutparameters。被remove掉后,ViewStub就没了。后续就得使用inflated ID。
ViewStub的xml布局范例
<ViewStubandroid:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip"/>
解析前通过android:id->stub可以find到ViewStub,inflate()之后通过android:inflatedId->subTree也可以找到inflatedlayout。
换个方式,还可以这样。
ViewStub stub = (ViewStub) findViewById(R.id.stub);
View inflated = stub.inflate();
Inflatedlayout不需要通过findViewById也可以直接get到View。
这是官方推荐的获取方式。我也觉得更靠谱,避免了一些不必要的逻辑问题。
源码解析
变量定义
private int mLayoutResource = 0;
private int mInflatedId;
private WeakReference<View>mInflatedViewRef;
private LayoutInflater mInflater;
private OnInflateListener mInflateListener;
这里需要看下红字标明的部分。
ViewStub结构体
public ViewStub(Context context, intlayoutResource) {