Подтвердить что ты не робот

Отклонить диалоговое окно после изменения ориентации экрана

1) Я запускаю фоновое задание (через AsyncTask)

new FindJourneyTask().execute(); // FindJourneyTask extends AsyncTask

2) Все еще в основном потоке (как раз перед запуском нового потока) я создаю диалог с showDialog (dialogId)

// this method is in FindJourneyTask
protected void onPreExecute() {
    showDialog(DIALOG_FINDING_JOURNEY);
}

3) Изменения ориентации экрана и активность воссозданы

4) Как я могу отменить диалог из FindJourneyTask? Вызов dispDialog (dialogId) ничего не делает.

// this method is in FindJourneyTask
protected void onPostExecute(FindJourneyResult result) {
    dismissDialog(DIALOG_FINDING_JOURNEY); // does nothing
}
4b9b3361

Ответ 1

Это обычная проблема, и нет реальных хороших решений. Проблема в том, что при изменении ориентации экрана вся активность уничтожается и воссоздается. В то же время диалоговое окно, которое вы ранее имели, воссоздается в новом действии, но старая фоновая задача по-прежнему относится к старой активности, когда она пытается отклонить диалог. В результате он отклоняет диалог, который был давно уничтожен, вместо того, чтобы отклонять диалог, созданный новой ориентацией.

Существует три основных решения:

  • Переопределите стандартный код обработки ориентации, чтобы ваша активность не была уничтожена при вращении. Это, вероятно, наименее удовлетворительный ответ, поскольку он блокирует много кода, который автоматически запускается при изменении ориентации.

  • Создайте статическую переменную-член вашей деятельности, которая ссылается на самую активность, поэтому вы можете вызвать STATIC_ACTIVITY_VARIABLE.dismissDialog().

  • Составьте решение, в котором фоновая задача отслеживает текущую активность и при необходимости обновляет.

Эти три решения подробно обсуждаются здесь: http://groups.google.com/group/android-developers/browse_thread/thread/bf046b95cf38832d/

Ответ 2

В настоящее время существует лучшее решение этой проблемы, которая включает в себя использование фрагментов.

Если вы создаете диалог с помощью диалогового окна "Диалог", то этот фрагмент будет отвечать за сохранение жизненного цикла вашего диалога. Когда вы показываете диалог, вы добавляете тег для своего фрагмента (DialogFragment.show()). Когда вам нужно получить доступ к диалоговому окну, вы просто ищете необходимый DialogFragment, используя FragmentManager.findFragmentByTag вместо ссылки на сам диалог.

Таким образом, если устройство изменит ориентацию, вы получите новый фрагмент вместо старого, и все будет работать.

Здесь некоторый код, основанный также в ответе @peresisUser:

public void onSaveInstanceState(Bundle outState) {
   AppCompatActivity activity = (AppCompatActivity) context;
   FragmentManager fragmentManager = activity.getSupportFragmentManager();
   DialogFragment dialogFragment = (DialogFragment) fragmentManager.findFragmentByTag("your_dialog_tag");
   if(dialogFragment!=null) {
      Dialog dialog = dialogFragment.getDialog();
      if(dialog!=null && dialog.isShowing()) {
         dialogFragment.dismiss();
      }
   }
}

Ответ 3

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

Я проверяю onSavedInstance(), который работает при изменении ориентации, показывает или нет диалог с dialog.isShowing() и передает его в переменную outState. Затем в вашем onCreate() вы проверяете этот var, если это правда. Если это так, вы просто отклоняете свой диалог с помощью dialog.dismiss()

Надеюсь, что это поможет другим:()