Правильный способ отклонения диалогового фрагмента, пока применение находится в фоновом режиме
-
27-10-2019 - |
Вопрос
Я начал использовать Dialogfragment, потому что они хорошо работают с помощью изменений ориентации и прочее. Но есть неприятная проблема, с которой я столкнулся.
У меня есть AsyncTask
Это показывает диалог прогресса и отклоняет его onPostExecute
. Анкет Все работает нормально, кроме когда onPostExecute
происходит, когда приложение находится на фоне (например, после нажатия кнопки «Домой»). Затем я получил эту ошибку при увольнении диалога - "Can not perform this action after onSaveInstanceState
". Doh. Регулярные диалоги работают просто отлично. Но не FragmentDialog.
Поэтому мне интересно, каков правильный способ отклонения диалогового фрагмента, пока применение находится в фоновом режиме? Я не очень много работал с фрагментами, поэтому я думаю, что я просто что -то упускаю.
Решение
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)
В вашем диалоге, но это не самое красивое из исправлений.
Иногда я заметил, что мне нужно стоять в очереди в своем диалоговом действии, чтобы в первую очередь позволил структуре восстановить состояние. Если вы можете получить текущую петлю (Activity.getMainLooper())
И оберните это в обработчик, вы можете попытаться перенести свое увольнение в заднюю часть очереди, опубликовав забегающуюся в этой очереди.
Я часто в конечном итоге использую отдельный фрагмент, который он retaininstance(true)
это имеет ResultReceiver
. Анкет Поэтому я передаю этот получатель результата на свои работы и обрабатываю обратные вызовы в его receive (часто как маршрутизатор для других приемников). Но это может быть немного больше работы, чем стоит, если вы используете асинхронные задачи.