ViewStub源码研究

周末在家,没有办法写demo,当然也没办法测试,只能通过源码直接分析。网上找了一个源码库,分享给大家

链接:http://repository.grepcode.com/java/ext/

ViewStub源码链接:http://www.grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/ViewStub.java

简介

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) {

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值