Я запускаю 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()
, я получу первое исключение.
onSaveInstanceState
? Если нет, то переопределите его. И не обращайтесь кsuper()
по методуonSaveInstanceState
. Это может помочь - person Shoshi   schedule 04.05.2016parentActivity
наgetActivity()
? я имею в виду что-то вродеselectPoiAroundDialog.show(getActivity().getSupportFragmentManager(), "mSelectPoiCategoryDialog");
- person Shoshi   schedule 04.05.2016IllegalStateException: Activity has been destroyed
неIllegalStateException: Can not perform this action after onSaveInstanceState
- person Shoshi   schedule 04.05.2016getActivity()
- person bendaf   schedule 04.05.2016