Когда я изменяю ориентацию устройства, если был показан AlertDialog, он исчезает. Это верно для всех, кроме одного диалога в моем приложении, и я не могу понять ни того, что так особенного в том, которое не исчезает, и как противодействовать этому поведению. Любая возможность сохранять диалоги при изменении ориентации (кроме ручного управления)?Почему некоторые AlertDialogs исчезают при вращении устройства?
ответ
Как было предложено много людей здесь,
android:configChanges="keyboardHidden|orientation"
не является решением проблемы. В лучшем случае это взлом. Правильный способ справиться с этим - управлять диалоговыми окнами через вашу деятельность. Вам необходимо переопределить несколько методов в вашем действии, например:
protected Dialog onCreateDialog(int id) {
// create and return your dialog instance here
AlertDialog dialog = new AlertDialog.Builder(context)
.setTitle(title)
.setIcon(R.drawable.indicator_input_error)
.setMessage(message)
.create();
dialog.setButton(
DialogInterface.BUTTON_POSITIVE,
context.getString(R.string.OK),
(DialogInterface.OnClickListener) null);
return dialog;
}
protected void onPrepareDialog(int id, Dialog dialog) {
// You dialog initialization code here
}
После этого вы закончите с этим. Вы показываете свой диалог, используя:
showDialog(yourDialogID);
После того, как вы закончите реализации этого your'll увидеть, что ваш диалог также будет воссоздан, если происходят изменения конфигурации. Лучше всего то, что ваш Activity
будет управлять вашим диалоговым окном для вас. Он будет использоваться повторно, когда это возможно, уменьшая время загрузки диалогового окна, если вы выполняете большую инициализацию.
Note from Android SDK documentation: Использование этого атрибута следует избегать и использовать только в качестве последней инстанции. Пожалуйста, прочитайте «Обработка изменений времени выполнения» для получения дополнительной информации о том, как правильно обрабатывать перезапуск из-за изменения конфигурации.
я думаю, может быть, вы должны принять
android:configChanges="keyboardHidden|orientation"
в MainFest вашей деятельности
Its becuase деятельности перезагружается при повороте устройства.
Если добавить
android:configChanges="keyboardHidden|orientation"
тег для каждого вида деятельности вы не хотите, чтобы перезапустить на изменение конфигурации добавить следующий тег.
Возможно, вы вызывали в этом диалоговом окне setCancelable(true)
. Но не уверен, что это может повлиять на поведение диалога.
Я думаю, вероятно, потому что метод OnCreate вызван изменением ориентации, и активность снова создается, поэтому диалог исчезает.
Хорошая точка. Тег в моем ответе ниже устранит эту проблему. –
при повороте устройства перезапускает вашу деятельность, поэтому ваш диалог получить исчезают, чтобы решить эту проблему просто включать в себя следующие атрибуты в андроид-манифеста XML
android:configChanges="keyboardHidden|orientation"
Вы также можете переопределить метод onSaveInstanceState и сохранить флаг, указывающий, показывался ли ваш диалог при изменении ориентации. Затем вы можете вернуть этот флаг из пакета в onCreate и повторно отобразить диалоговое окно, если это необходимо.
@Override
protected void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
// Save the state so that it can be restored in onCreate or onRestoreInstanceState
state.putBoolean("dialog_showing", dialog_showing);
}
@Override
public void onCreate(Bundle savedInstanceState) {
...
if(savedInstanceState != null && savedInstanceState.getBoolean("dialog_showing", false)) {
// Show your dialog again
...
}
...
}
EDIT:
Вместо того, чтобы восстановить свое состояние в onCreate
вы можете также переопределить метод onRestoreInstanceState
. Он вызывается после onStart
и будет вызываться только в том случае, если пакет не равен NULL; поэтому вам не нужно выполнять нулевую проверку пакета, как в методе onCreate
.
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if(savedInstanceState.getBoolean("dialog_showing", false)) {
// Show your dialog again
...
}
}
Это, вероятно, правильный способ сделать это, спасибо. –
Определенно лучшее решение при соблюдении жизненного цикла естественной деятельности. Просто не забудьте определить глобальную переменную для 'AlertDialog' и отпустите ее' onDestroy() ', чтобы предотвратить утечку окон. –
- 1. UITableView, содержимое UITableViewCell исчезают при вращении устройства
- 2. Top пространства при вращении устройства
- 3. Вращение камеры при вращении устройства
- 4. Сохранить кеш при вращении устройства
- 5. Держите CAEmitter центрированным при вращении устройства
- 6. Удалить div встроенный стиль при вращении устройства
- 7. Применение Остановлено при вращении устройства Android
- 8. Как обрабатывать UIImage при вращении устройства
- 9. glsurfaceview увеличить ширину экрана при вращении устройства
- 10. Muliple AlertDialogs при щелчке
- 11. Почему шкала AffineTransform при вращении
- 12. Почему некоторые строки исчезают при сортировке или фильтрации таблицы listjs
- 13. Почему некоторые уведомления об обновлениях не исчезают?
- 14. Динамически добавленный вид изображения исчезает onPause() или при вращении устройства
- 15. Надутые предметы исчезают при изменении ориентации устройства
- 16. Ошибка приложения при использовании AlertDialogs
- 17. Черный экран при opining пейзаж активности при вращении устройства андроида
- 18. Android AlertDialogs
- 19. Данные о физическом вращении устройства Android
- 20. Скрыть UIView при вращении устройства - не работает, когда устройство горизонтально
- 21. Запрос на мультимедиа не применяется при вращении устройства
- 22. Как сохранить состояние карты на вращении устройства?
- 23. IllegalArgumentException при вращении устройства в Live Wallpaper picker Android 3.0
- 24. didRotateFromInterfaceOrientation стрельба дважды при вращении
- 25. Как сделать autoLayout для UISearchController при вращении устройства?
- 26. UIWebView дисплей и сенсорная область при вращении устройства
- 27. configChanges вопрос при вращении устройства между двумя действиями [+ VIDEO]
- 28. LoaderInfoister (LoaderInfo) имеет значение null при вращении устройства
- 29. Ориентация устройства иногда возвращает неизвестное значение при слишком быстром вращении
- 30. Самый простой способ переместить вид слева вверху при вращении устройства
К сожалению, это не для меня, так как не все мои диалоги являются обычными, я много использую alertBuilder. Но спасибо за то, что вы показали правильный путь. –
Кстати, 'android: configChanges =" orientation "' отлично работает, что за улов? Я читал об этом, но все еще не совсем понимаю возможные недостатки. –
Если вы используете этот атрибут, вы говорите андроиду не воссоздавать свою активность при изменении ориентации. Это не андроидный путь AFAIK. Подробнее см. Http://developer.android.com/guide/topics/manifest/activity-element.html#config. Есть особое замечание об исключении этого метода. Кроме того, вы можете вернуть диалог оповещения, созданный с помощью AlertDialog.Builder, используя метод, описанный выше. –