【发布时间】:2017-05-18 21:44:25
【问题描述】:
之前有过这种情况并通过检查活动 isFinishing 或是否已调用 onSaveInstanceState 来解决。
但有时它通过检查后仍然会发生。它只是一个列表,单击该项目将打开另一个片段以显示详细信息。
在 Activity 的处理程序中,isFinishing() 和 onSaveInstanceState 是否已被调用并正常,但 ft.commit() 仍然会导致 IllegalStateException。
由于列表仍在显示中,怎么会发生这种情况?还有什么可以用来预防呢?
同样,在大多数情况下它工作正常,但有时会在此行看到报告的崩溃。
Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1832)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1850)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:643)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:603)
at com.zeta.MainActivity.showMessageDetailsFragment(MainActivity.java:4522)
at com.zeta.messagelist.ListFragment.onListItemClick(ListFragment.java:1945)
at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:60)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3073)
at android.widget.AbsListView$3.run(AbsListView.java:3910)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
@Override
protected void onSaveInstanceState(Bundle outState) {
mInSaveInstanceState = true;
super.onSaveInstanceState(outState);
}
private void showMessageDetailsFragment(MessageContext messageContext) {
if ((!mInSaveInstanceState) && !isFinishing()) {
MessageDetailsFragment detailsFragment = new MessageDetailsFragment(messageContext);
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.details_fragment_holder, detailsFragment, "DETAILS_FRAGMENT");
ft.addToBackStack("DETAILS_FRAGMENT");
ft.setCustomAnimations(R.anim.hold, FragmentTransaction.TRANSIT_NONE,
R.anim.slide_left_in, FragmentTransaction.TRANSIT_NONE);
ft.show(detailsFragment);
ft.commit(); //<=== java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
【问题讨论】:
-
如果你使用replace,那你为什么还要使用show?删除节目并尝试
-
之前是 add(),添加和替换都有这个异常。
标签: android illegalstateexception