2016-08-24 2 views
1

Мы используем Dialogfragment для отображения некоторых диалогов, а иногда это вызывает «IllegalStateException: не может выполнить это действие после onSaveInstanceState».Android: все еще преследует «Невозможно выполнить это действие после onSaveInstanceState» в некоторых случаях

В прошлом это происходило часто, и мне удалось уменьшить количество этого исключения IllegalStateException, написав диалог DialogHelper для показа/увольнения.

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

Сообщенные сбои в данный момент происходят при нажатии кнопки, и мы хотим показать диалог (например, DateSliderDialog), но я не могу воспроизвести Crash: /.

mFromDateButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (!isFinishing()) { 
       String title= getString(R.string.dateSliderTitle); 
       DateSliderDialog dateSliderDialog= DateSliderDialog.newInstance(title, getMinFromDate().getTimeInMillis(), getFromDateForDialog().getTimeInMillis(), DateUtils.getEndOfUniverseDate().getTime()); 
       DialogHelper.showDialog(getSupportFragmentManager(), dateSliderDialog, InquireReservationActivity.this, String.valueOf(FROM_DATE_DIALOG_ID)); 
      } 
     } 
    }); 

, который вызывает метод DialogHelper.showDialog (...)

public static void showDialog(FragmentManager fragmentManager, DialogFragment dialogFragment, Context context, String dialogTag) { 
    if (fragmentManager != null && dialogFragment != null && (dialogFragment.getDialog() == null || !dialogFragment.getDialog().isShowing())) { 
     if (context instanceof MyActivity) { 
      if(!((MyActivity)context).isFinishing() && ((MyActivity)context).mIsActivityRunning) { 
       dialogFragment.show(fragmentManager, dialogTag); 
      } 
     } else if (context instanceof MyListActivity) { 
      if(!((MyListActivity)context).isFinishing() && ((MyListActivity)context).mIsActivityRunning) { 
       dialogFragment.show(fragmentManager, dialogTag); 
      } 
     } else if (context instanceof MyPreferenceActivity) { 
      if(!((MyPreferenceActivity)context).isFinishing() && ((MyPreferenceActivity)context).mIsActivityRunning) { 
       dialogFragment.show(fragmentManager, dialogTag); 
      } 
     } else { 
      if(!((Activity)context).isFinishing()) { 
       dialogFragment.show(fragmentManager, dialogTag); 
      } 
     } 
    } 
} 

Как вы можете видеть, я уже проверка:

  • ли активность отделки?
  • Работает ли операция (через флаг на мероприятии)?

У кого-нибудь есть ключ, почему это все еще происходит и как его исправить?

Спасибо за ваши предложения и ответы

ответ

1

Всякий раз, когда отпускаешь диалог, использовать

dialogFragment.dismissAllowingStateLoss(); 
+0

Я уже делают это, и фиксированные все вопросы при увольнении, но не при показе dialogFragment. Вышеупомянутая проблема возникает только для показа диалоговых фрагментов, а не для отклонения. – byemute

+0

обратитесь к следующей теме: http://stackoverflow.com/questions/10114324/show-dialogfragment-from-onactivityresult – Nidhi

+0

Я уже проверил это, прежде чем публиковать свой вопрос. Единственное решение, которое я вижу там, заключается в использовании FragmentTransaction с commitAllowingStateLoss(), поскольку мой DialogFragment показан onClick, и я не могу контролировать, происходит ли onClick до или после сохранения состояния. Есть ли другие решения, кроме использования dialogFragment.show() с FragmentTranscation, где я устанавливаю commitAllowingStateLoss()? – byemute

Смежные вопросы