fragment或者dialogFragment show或者dismiss可能出现这个错误. 因为在onSaveInstanceState之后调用了commit
解决方法
onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后再给它添加Fragment就会出错。解决办法就是把commit()方法替换成 commitAllowingStateLoss(), dialogFragment需要将dismiss换成dismissAllowingStateLoss. 表示允许状态丢失.
一般只在可能出现这种问题的时候这么做. 如果确定不会在其它线程show fragment的话使用普通的commit就好
捕获异常不操作, 解决方法其实有很多,可以上Stack Overflow搜一搜
@Override
public void show(FragmentManager manager, String tag) {
try {
super.show(manager, tag);
} catch (IllegalStateException ignore) {
//
}
}
当dialogFragment的依附的activity已经关闭了的时候,不能再调用dismissAllowingStateLoss或dismiss之类的函数.
会抛如下错误:
Caused by: java.lang.IllegalStateException: Activity has been destroyed
android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1458)
android.app.BackStackRecord.commitInternal(BackStackRecord.java:708)
android.app.BackStackRecord.commit(BackStackRecord.java:672)
android.app.DialogFragment.show(DialogFragment.java:230)
解决方法, 重写一下dismiss 判断一个activity是否正在结束
@Override
public void dismissAllowingStateLoss() {
if (!getActivity().isFinishing())
super.dismissAllowingStateLoss();
}