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

StackOverflow https://stackoverflow.com/questions/9325238

Вопрос

Я начал использовать 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 (часто как маршрутизатор для других приемников). Но это может быть немного больше работы, чем стоит, если вы используете асинхронные задачи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top