Когда-нибудь получить IllegalStateException: не может выполнить это действие после onSaveInstanceState после проверки в отделке

Если бы это было ранее и решено путем проверки активности isFinishing или onSaveInstanceState уже был вызван.

Но иногда это все же происходит после того, как он прошел проверку. Это просто список, и при нажатии на элемент откроется еще один фрагмент, чтобы показать подробности.

В обработчике действия 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

1 ответ

Попробуйте ft.commitAllowingStateLoss() вместо ft.commit()

Другие вопросы по тегам