美文网首页
Android ViewStub重复加载问题(ViewStub

Android ViewStub重复加载问题(ViewStub

作者: 三天过去了 | 来源:发表于2019-05-10 10:20 被阅读0次

错误信息

java.lang.IllegalStateException:ViewStub must have a non-null ViewGroup viewParent

原因(重复加载ViewStub),以下为 inflate( ) 方法的源码

源码很简单,抛出异常在最后一行代码

/**
     * Inflates the layout resource identified by {@link #getLayoutResource()}
     * and replaces this StubbedView in its parent by the inflated layout resource.
     *
     * @return The inflated layout resource.
     *
     */
    public View inflate() {
        final ViewParent viewParent = getParent();

        if (viewParent != null && viewParent instanceof ViewGroup) {
            if (mLayoutResource != 0) {
                final ViewGroup parent = (ViewGroup) viewParent;
                final View view = inflateViewNoAdd(parent);
                replaceSelfWithView(view, parent);

                mInflatedViewRef = new WeakReference<>(view);
                if (mInflateListener != null) {
                    mInflateListener.onInflate(this, view);
                }

                return view;
            } else {
                throw new IllegalArgumentException("ViewStub must have a valid layoutResource");
            }
        } else {
            //当viewParent等于null,或者不为ViewGroup时抛出此异常
            throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");
        }
    }

解决办法

当然原则上是要避免重复加载的逻辑出现,但是也可以通过下面的方式进行规避

private ViewStub mViewStub;
//定义一个布尔值,用于标记是否被inflated
private boolean isInflated;

private void initView(){
    mViewStub = findViewById(R.id.view_stub)
    //设置监听
    mViewStub.setOnInflateListener(new ViewStub.OnInflateListener() {
        @Override
        public void onInflate(ViewStub stub, View inflated) {
            isInflated = true;
        }
    });
}

private void inflateView(){
    if(!isInflated){
        //只有在未inflate的时候才去inflate
        mViewStub.inflate();
    }
}

相关文章

网友评论

      本文标题:Android ViewStub重复加载问题(ViewStub

      本文链接:https://www.haomeiwen.com/subject/xwjooqtx.html