您的位置:首页 > 编程语言 > Java开发

java.lang.IllegalStateException: Fragment does not have a view

2016-11-10 16:30 561 查看

java.lang.IllegalStateException: Fragment does not have a view

先说明下出现这个异常的原因,这是在fragment onCreateView()中调用getChildFragmentManager()的时候出现的。

解决办法就是不要再onCreateView()中调用getChildFragmentManager()。

看下fragment的源码:

这是getChildFragmentManager()

/**
* Return a private FragmentManager for placing and managing Fragments
* inside of this Fragment.
*/
final public FragmentManager getChildFragmentManager() {
if (mChildFragmentManager == null) {
instantiateChildFragmentManager();
if (mState >= RESUMED) {
mChildFragmentManager.dispatchResume();
} else if (mState >= STARTED) {
mChildFragmentManager.dispatchStart();
} else if (mState >= ACTIVITY_CREATED) {
mChildFragmentManager.dispatchActivityCreated();
} else if (mState >= CREATED) {
mChildFragmentManager.dispatchCreate();
}
}
return mChildFragmentManager;
}


我们再点击进入instantiateChildFragmentManager()方法中:

void instantiateChildFragmentManager() {
mChildFragmentManager = new FragmentManagerImpl();
mChildFragmentManager.attachController(mHost, new FragmentContainer() {
@Override
@Nullable
public View onFindViewById(int id) {
if (mView == null) {
throw new IllegalStateException("Fragment does not have a view");
}
return mView.findViewById(id);
}

@Override
public boolean onHasView() {
return (mView != null);
}
}, this);
}


这里可以看到判断了当前的mView是否为null,为null抛出异常。这mView源码的的解释是 :

// The View generated for this fragment.
View mView;

/**
* Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
* if provided.
*
* @return The fragment's root view, or null if it has no layout.
*/
@Nullable
public View getView() {
return mView;
}


这个mView是fragment的rootView,它是由onCreateView()方法提供。那么如果你要调用getChildFragmentManager(),那么必须onCreateView之后,view被创建了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  异常 bug
相关文章推荐