异常日志:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.fragment.app.FragmentManager.l(FragmentManager.java:11)
at androidx.fragment.app.FragmentManager.O(FragmentManager.java:26)
at androidx.fragment.app.BackStackRecord.t(BackStackRecord.java:70)
at androidx.fragment.app.BackStackRecord.g(BackStackRecord.java:1)
at androidx.fragment.app.DialogFragment.show(DialogFragment.java:13)
问题描述:
在activity中,定时任务到时后弹出DialogFragment或收到通知消息后弹出DialogFragment等情况,如果弹出DialogFragment的时候,已经跳转到了别的activity或者应用关闭退到后台等。会报错:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState。
解决办法:
在DialogFragment或者其父类中定义showAllowingStateLoss方法代替原show方法。
public void showAllowingStateLoss(FragmentManager manager, String tag){
try {
Field dismissed = DialogFragment.class.getDeclaredField("mDismissed");
dismissed.setAccessible(true);
dismissed.set(this, false);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
Field shown = DialogFragment.class.getDeclaredField("mShownByMe");
shown.setAccessible(true);
shown.set(this, true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commitAllowingStateLoss();
}
原因分析:
《解决java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState》