android DialogFragment 出现 Can not perform this action after onSaveInstanceState
在使用 android 的 DialogFragment 的时候如果实在 Activity 在后台的时候调用 dismiss 函数的时候会出现 Can not perform this action after onSaveInstanceState 的异常,这个异常跟 activity 状态被保存之后又尝试提交一个 FragmentTransaction,原因是因为 DialogFragment 在调用 dismiss 函数的时候需要提交一个 FragmentTransaction 事务,但是在 onSaveInstanceState () 函数调用之后,提交事务就会导致状态丢失,这样就会出现异常。不同的系统显示异常的方式不同
private static final String BUNDLE_FRAGMENTS_KEY = “android:support:fragments”;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
if (savedInstanceState != null && this.clearFragmentsTag()) {
//重建时清除 fragment的状态
savedInstanceState.remove(BUNDLE_FRAGMENTS_KEY);
}
super.onCreate(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (outState != null && this.clearFragmentsTag()) {
//销毁时不保存fragment的状态
outState.remove(BUNDLE_FRAGMENTS_KEY);
}
}
protected boolean clearFragmentsTag() {
return true;
}
为了避免这个问题就是在 Activity 在后台时或者 onSaveInstanceState () 和 onStop () 方法被调用后,就不直接调用 dismiss 函数改调用 dismissAllowingStateLoss。还有一种方式是把这个 DialogFragment 状态记录下,在 Activity 启动 的时候在调用 dismiss 函数。