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源码的的解释是 :
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被创建了。