IllegalStateException при отображении DialogFragment после возврата из AppCompatActivity

Я запускаю FragmentActivity из настраиваемого DialogFragment, и после того, как я вернусь к исходному Activity и снова попытаюсь открыть диалоговое окно, я получаю:

IllegalStateException: невозможно выполнить это действие после onSaveInstanceState

Я не понимаю, почему это происходит, если я отклоняю диалог из исходного действия, я могу показывать его снова столько раз, сколько захочу, но если после этого я запускаю новое действие из DialogFragment, я не могу снова показывать диалог потому что я получаю исключение.

Вот мой код, этот метод находится в моем DialogFragment:

 public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3){
     mSearchLocationType = position;
     switch(position){
         case PSL_CURRENT_POSITION: // I can show the dialog again after this.
             break;
         case PSL_MAP_POINT:
             Intent selectMapPoint = new Intent(parentActivity, SelectMapPointActivity.class);     
             selectMapPoint.putExtra(SelectMapPointFragment.EXTRA_SELECTED_POS, mSearchLocation);
             parentActivity.startActivityForResult(selectMapPoint, REQ_MAP_POINT); 
             // After returning this Activity and trying to show ANY DialogFragment the app crashes.
             break;
         case PSL_ADDRESS:
             Intent selectAddress = new Intent(parentActivity, SelectAddressActivity.class);
             parentActivity.startActivity(selectAddress); // Also from this Activity, makes no difference.
             break;
      }
      dismiss();
 }    

Я показываю диалог вроде:

if(!selectPoiAroundDialog.isVisible())
    selectPoiAroundDialog.show(parentActivity.getSupportFragmentManager(), "mSelectPoiCategoryDialog");

Что я уже пробовал:

  • # P7 #
    # P8 #
  • Выполните отладку приложения и проверьте, вызываются ли все методы жизненного цикла, но мне кажется нормальным каждый раз, когда вызывается метод onDestroyView () DialogFragment.

  • Переопределите методы show () и onDismiss () DialogFragment и отслеживайте, отображается он или нет.

Это корпоративное приложение с плохим дизайном, поэтому класс, который я пытаюсь изменить (где я показываю диалог), не является дочерним для Activity или Fragment. Доступ к «parentActivity »осуществляется статическим методом класса приложения, но я уверен, что он имеет правильную Activity. Как вы думаете, это может вызвать проблему?

РЕДАКТИРОВАТЬ: Полная трассировка стека - это когда я использую commitAllowStateLoss ():

 java.lang.IllegalStateException: Activity has been destroyed
 at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1515)
 at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638)
 at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:621)
 at com.mycompany.dialog.GTDialog.show(GTDialog.java:174)
 at com.mycompany.fragment.content.SearchOfflinePOIContent$2.onClick(SearchOfflinePOIContent.java:250)
 at android.view.View.performClick(View.java:5201)
 at android.view.View$PerformClick.run(View.java:21209)
 at android.os.Handler.handleCallback(Handler.java:739)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:148)
 at android.app.ActivityThread.main(ActivityThread.java:5525)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
  • Еще пробовал переопределить метод onSaveInstanceState(), не помогло.

EDIT2: исходная трассировка стека:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1493)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:617)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:139)
at com.mycompany.dialog.GTDialog.show(GTDialog.java:174)
at com.mycompany.fragment.content.SearchOfflinePOIContent$1.onClick(SearchOfflinePOIContent.java:197)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21209)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

Если я переопределю метод show () и попытаюсь зафиксировать фрагмент с помощью commitAllowingStateLoss(), я получу первое исключение.


comment
Не могли бы вы опубликовать полный журнал ошибок?   -  person Shoshi    schedule 04.05.2016
comment
Вы переопределили метод onSaveInstanceState? Если нет, то переопределите его. И не обращайтесь к super() по методу onSaveInstanceState. Это может помочь   -  person Shoshi    schedule 04.05.2016
comment
Также проверьте этот ответ: stackoverflow.com/questions/7575921/   -  person Shoshi    schedule 04.05.2016
comment
@Shoshi Я добавил полную трассировку стека к вопросу, я не вызываю popbackstack :(. Я попытался переопределить метод onSaveInstanceState, но ничего не изменилось :(.   -  person bendaf    schedule 04.05.2016
comment
вы пробовали заменить parentActivity на getActivity()? я имею в виду что-то вроде selectPoiAroundDialog.show(getActivity().getSupportFragmentManager(), "mSelectPoiCategoryDialog");   -  person Shoshi    schedule 04.05.2016
comment
и вы видели, что теперь ошибка IllegalStateException: Activity has been destroyed не IllegalStateException: Can not perform this action after onSaveInstanceState   -  person Shoshi    schedule 04.05.2016
comment
@Shoshi Я вижу разницу, пытаясь воспроизвести исходное исключение .. Поскольку класс не является дочерним по отношению к Activity, у него нет метода getActivity()   -  person bendaf    schedule 04.05.2016
comment
@Shoshi Я редактирую свой вопрос   -  person bendaf    schedule 04.05.2016


Ответы (1)


Я разобрался в проблеме. Когда приложение выходит из Activity, оно не удаляет ссылку на него из parentActivity, поэтому, когда я снова попытался показать диалог, я дал ссылку на уничтоженное действие.

Спасибо за ваше время!

person bendaf    schedule 06.05.2016
comment
рад, что вы обнаружили проблему (у) - person Shoshi; 09.05.2016
comment
спасибо приятель: D наилучшие пожелания в твоей программистской жизни: D - person Shoshi; 09.05.2016
comment
Но как ты это исправил? - person X09; 06.07.2016
comment
Я удалил ссылку на уничтоженную активность из переменной parentActivity. - person bendaf; 19.07.2016