Правильный способ отклонения DialogFragment в то время как приложение находится в фоновом режиме
Я начал использовать DialogFragment, потому что они хорошо работают через изменения ориентации и прочее. Но есть неприятная проблема, с которой я столкнулся.
у меня есть AsyncTask
Что показывает прогресс DialogFragment и отклоняет его onPostExecute
. Все работает нормально, за исключением случаев onPostExecute
происходит, пока приложение находится в фоновом режиме (после нажатия кнопки Home, например). Затем я получил эту ошибку на DialogFragment увольнения - "Can not perform this action after onSaveInstanceState
". До. Обычные диалоги работают просто отлично. Но нет FragmentDialog.
поэтому мне интересно, Как правильно отклонить DialogFragment, пока приложение находится в фоновом режиме? Я не очень много работал с фрагментами, поэтому я думаю, что я просто что-то упускаю.
4 ответа:
вот что я сделал
(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 (часто как маршрутизатор для других приемников). Но это может быть немного больше работы, чем это стоит, если вы используете асинхронные задачи.