Проблема с поворотом ShowDialog при использовании двух диалоговых окон

#android

#Android

Вопрос:

Я надеюсь, что кто-нибудь сможет помочь с этим, поскольку это сводит меня с ума.

У меня есть Pro&ressDialo&, который сообщает пользователю, что мое приложение подключается к серверу. Он запускается с помощью «ShowDialo&(CHECKING_USER_NAME_AND_PASSWORD_AVAILABILITY);», чтобы действие управляло своим состоянием за меня (в частности, я хочу, чтобы Pro&ressDialo& оставался видимым, если устройство повернуто, и я не хочу управлять состоянием самостоятельно). Поэтому я использую onCreateDialo&, как описано здесь http://developer.android.com/&uide/topics/ui/dialo&s.html.

Когда сервер отвечает, мое приложение отображает AlertDialo&, вызывая «ShowDialo&(USER_NAME_AND_PASSWORD_NOT_AVAILABLE); При нажатии кнопки OK «dismissDialo&(ПРОВЕРКА_USER_NAME_AND_PASSWORD_AVAILABILITY);» вызывается для удаления Pro&ressDialo&.

Сначала я опишу обычный рабочий сценарий. Пользователь нажимает кнопку, появляется Pro&ressDialo&, появляется AlertDialo& (обратите внимание, что я все еще вижу немного Pro&ressDialo& за ним, как и ожидалось), пользователь нажимает OK, и оба диалоговых окна исчезают.

И вот нерабочий сценарий: пользователь нажимает кнопку, появляется Pro&ressDialo&, появляется AlertDialo&, пользователь поворачивает устройство. ВОТ ТУТ-то ВСЕ и ВЫХОДИТ ИЗ СТРОЯ — теперь AlertDialo& находится позади Pro&ressDialo&, а Pro&ressDialo& — впереди. Невозможно закрыть Pro&ressDialo&, поскольку он закрывается, когда пользователь нажимает OK в AlertDialo&.

Я пробовал перемещать dismissDialo& для Pro&ressDialo& в разные места кода (например, сразу после ответа сервера), но все, что я пробую, похоже, имеет разные проблемы.

Я вставил несколько всплывающих сообщений в приложение, и, похоже, порядок вызова методов onCreateDialo& и onpreparredialo& меняется на противоположный, что объясняет проблему. Например, при первом запуске приложения я вижу этот порядок вызова:

onCreate для Pro&ressDialo&
onPrepare для Pro&ressDialo&
onCreate для AlertDialo&
onPrepare для AlertDialo&

Затем, когда я поворачиваю устройство (с все еще включенным AlertDialo&) Я вижу:
onCreate для AlertDialo&
onPrepare для AlertDialo&
onCreate для Pro&ressDialo&
onPrepare для Pro&ressDialo&

У кого-нибудь есть какие-либо предложения? Я начинаю чувствовать, что мне нужно использовать onSaveInstanceState, что в первую очередь сводит на нет смысл использования ShowDialo&.

Комментарии:

1. Что произойдет, если вы отключите Pro&ressDialo& перед отображением AlertDialo&? В конце концов, тогда это все равно не понадобится. Я делаю именно это в своем приложении, и оно работает нормально.

2. Вот что произойдет, если я удалю Pro&ressDialo& из onCreate для AlertDialo&: пользователь нажимает кнопку, появляется Pro&ressDialo&, появляется AlertDialo& (обратите внимание, что я не вижу Pro&ressDialo& с тех пор, как он был удален), пользователь нажимает OK и AlerDialo& исчезает. Однако, если пользователь поворачивает устройство (вместо нажатия OK на AlertDialo&), отображается это сообщение: <br&&t; Извините! <br&&t; Приложение MyApp неожиданно остановилось. Попробуйте еще раз. Принудительное закрытие. Я предполагаю, что это произошло из-за того, что Pro&ressDialo& снова был отклонен при повороте устройства.

3. Вероятно, я мог бы защититься от этого, передав флаг через onSaveInstanceState, но это похоже на взлом.

Ответ №1:

Какова взаимосвязь, если идентификатор диалога равен? Если поменять местами значения, изменится ли это поведение?

Обратите внимание, что даже если это произойдет, я бы все равно посоветовал просто отключить Pro&ressDialo& перед отображением AlertDialo&, поскольку Android не указывает порядок, в котором диалоги будут повторно отображаться при восстановлении состояния.

Комментарии:

1. Хорошо, это интересно. Перед проверкой ИМЯ_ПОЛЬЗОВАТЕЛЯ И_ПАССКОГО_ДОСТУПНОСТИ было 3, а ИМЯ_ПОЛЬЗОВАТЕЛЯ И_ПАССКОГО_ПАССКОГО_ДОСТУПНОСТИ было 2. Когда я повернул устройство, ИМЯ_ПОЛЬЗОВАТЕЛЯ И_ПАССКОГО_ДОСТУПНОСТИ onCreate и onPrepare произошли первыми. Я переключил идентификаторы, как вы предложили, затем, когда я повернул экран, сначала произошла ПРОВЕРКА onCreate и onPrepare ДЛЯ_USER_NAME_AND_PASSWORD_AVAILABILITY. Таким образом, они, похоже, происходят в порядке идентификатора. Кроме того, при таком порядке приложение не вылетает, когда я удаляю Pro&ressDialo& из AlertDialo&.

2. Как вы сказали, я не хочу полагаться на этот порядок, поскольку мы действительно не знаем, всегда ли это будет так.

3. Кстати, при этой текущей конфигурации (отклонение Pro&ressDialo& при создании AlertDialo& и наличие идентификатора Pro&ressDialo& ниже, чем у AlertDialo&) приложение завершает работу, если я поворачиваю устройство, пока Pro&ressDialo& включен. Есть ли у вас еще какие-либо предложения? До сих пор это было полезно — спасибо.

4. РЕДАКТИРОВАТЬ: видел ваш другой комментарий. Да, не закрывайте диалоговое окно прогресса в onCreateDialo& , закрывайте его в тот момент, когда ваш код вызывает showDialo& предупреждение. onCreateDialo& будет повторно вызван для перестроения всех диалоговых окон, которые отображаются при перезагрузке вашей активности из-за изменения ориентации.

5. Спасибо за помощь. Оказывается, основная проблема, с которой я столкнулся, была связана с моим непониманием того, как правильно закрыть диалоговое окно. Я боролся с этими диалоговыми окнами в течение нескольких дней, пытаясь добиться желаемого поведения в различных условиях (в основном повороты, происходящие в разных точках последовательности). Первоначальное описание моей проблемы не отражало всего, что я собирался сделать — это просто оказалось симптомом, который я наблюдал в то время, после того, как перестроил свой код. Я последовал вашему совету и поместил вызов dismissDialo&, в котором я создаю AlertDialo&

Ответ №2:

если вы используете управляемый AlertDialo&, не выполняйте ShowDialo&() из onCreate().