美文网首页
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