错误信息
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();
}
}
网友评论