Правильный способ отклонения DialogFragment в то время как приложение находится в фоновом режиме


Я начал использовать DialogFragment, потому что они хорошо работают через изменения ориентации и прочее. Но есть неприятная проблема, с которой я столкнулся.

у меня есть AsyncTask Что показывает прогресс DialogFragment и отклоняет его onPostExecute. Все работает нормально, за исключением случаев onPostExecute происходит, пока приложение находится в фоновом режиме (после нажатия кнопки Home, например). Затем я получил эту ошибку на DialogFragment увольнения - "Can not perform this action after onSaveInstanceState". До. Обычные диалоги работают просто отлично. Но нет FragmentDialog.

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

4 57

4 ответа:

DialogFragment имеет метод под названием dismissAllowingStateLoss()

вот что я сделал (df == dialogFragment):

убедитесь, что вы вызываете диалог таким образом:

df.show(getFragmentManager(), "DialogFragment_FLAG");

если вы хотите отключить диалог, сделайте эту проверку:

if (df.isResumed()){
  df.dismiss();
}
return;

убедитесь, что у вас есть следующее в методе onResume() вашего фрагмента (не df)

@Override
public void onResume(){
  Fragment f = getFragmentManager().findFragmentByTag("DialogFragment_FLAG");
  if (f != null) {
    DialogFragment df = (DialogFragment) f;
    df.dismiss();
  }
  super.onResume();
}   

таким образом, диалог будет отклонен, если он виден.. если диалог не отображается, он будет отклонен, после чего фрагмент станет видимым (onResume)...

Это то, что я должен был сделать, чтобы достичь того, что вы хотите: У меня есть фрагмент активности, на котором я показывал фрагмент диалога с именем fragment_RedemptionPayment который глобально объявлен в верхней части. Следующий код отклоняет DialogFragment если он показывался до того, как активность переходит в фоновый режим и возвращается на передний план.

     @Override
        public void onResume() {
            super.onResume();        
            if(fragment_RedemptionPayment.isVisible()){
                fragment_RedemptionPayment.dismiss();
            }
}

решение, которое может сработать установка Fragment.setRetainInstance(true) в вашем dialogfragment, но это не самый красивый из исправлений.

иногда я замечал, что мне нужно поставить в очередь свои диалоговые действия, чтобы сначала восстановить состояние фреймворка. Если вы можете получить доступ к текущему Петлителю (Activity.getMainLooper()) и оберните это в обработчик, который вы можете попробовать передать свое увольнение в конец очереди, разместив в этой очереди запускаемый объект.

Я часто в конечном итоге с помощью отдельного фрагмента, что retaininstance(true) что есть ResultReceiver. Поэтому я передаю этот приемник результатов своим заданиям и обрабатываю обратные вызовы в своем onReceive (часто как маршрутизатор для других приемников). Но это может быть немного больше работы, чем это стоит, если вы используете асинхронные задачи.