Я пытаюсь предотвратить закрытие диалогов, созданных с помощью построителя предупреждений, при перезапуске действия.
Если я перегружу метод onConfigurationChanged, я смогу успешно сделать это и сбросить макет для правильной ориентации, но я потеряю функцию липкого текста для edittext. Итак, при решении проблемы диалога я создал эту проблему edittext.
Если я сохраню строки из edittext и переназначу их в изменении onCofiguration, они все равно будут иметь начальное значение по умолчанию, а не то, что было введено до поворота. Даже если я принудительно аннулирую их, кажется, что они обновляются.
Мне действительно нужно решить либо проблему диалога, либо проблему редактирования текста.
Спасибо за помощь.
Ответы:
На сегодняшний день лучший способ избежать этой проблемы - использовать расширение
DialogFragment
.Создайте новый класс, который расширяется
DialogFragment
. ОтменитеonCreateDialog
и верните свой старыйDialog
илиAlertDialog
.Затем вы можете показать это с помощью
DialogFragment.show(fragmentManager, tag)
.Вот пример с
Listener
:И в действии, которое вы вызываете:
Этот ответ помогает объяснить эти три других вопроса (и ответы на них):
источник
onAttach
сейчас это устарело. Что делать вместо этого?onAttach(Context context)
иandroid.support.v4.app.DialogFragment
. ТеперьonAttach
метод принимаетcontext
вместоactivity
параметра.YesNoListener
Хотя , вероятно, в этом нет необходимости . Смотрите этот ответ .источник
Context
внутри диалоговых кнопокOnClickListener
.Если вы меняете макет при изменении ориентации, я бы не стал добавлять
android:configChanges="orientation"
ваш манифест, потому что вы все равно воссоздаете представления.Сохраните текущее состояние вашей деятельности (например, введенный текст, отображаемое диалоговое окно, отображаемые данные и т. Д.), Используя следующие методы:
Таким образом, действие снова проходит через onCreate, а затем вызывает метод onRestoreInstanceState, в котором вы можете снова установить значение EditText.
Если вы хотите хранить более сложные объекты, вы можете использовать
Здесь вы можете сохранить любой объект, а в onCreate вам просто нужно позвонить,
getLastNonConfigurationInstance();
чтобы получить объект.источник
OnRetainNonConfigurationInstance()
теперь осуждается как Док говорит: developer.android.com/reference/android/app/...setRetainInstance(boolean retain)
должен использовать вместо: developer.android.com/reference/android/app/...setRetainInstance
совершенно другой: он для фрагментов и не гарантирует, что экземпляр будет сохранен.Просто добавьте android: configChanges = "Ориентация" с элементом действия в AndroidManifest.xml.
Пример:
источник
Очень простой подход - создать диалоги с помощью метода
onCreateDialog()
(см. Примечание ниже). Вы их показываетеshowDialog()
. Таким образом, Android ручки вращения для вас , и вам не придется звонитьdismiss()
в ,onPause()
чтобы избежать WindowLeak , а затем вы ни должны восстановить диалог. Из документов:См. Дополнительную информацию в документации Android showDialog () . Надеюсь, это кому-то поможет!
Примечание. При использовании AlertDialog.Builder не звоните
show()
изonCreateDialog()
, а звонитеcreate()
. Если вы используете ProgressDialog, просто создайте объект, задайте нужные параметры и верните его. В заключение,show()
внутриonCreateDialog()
вызывает проблемы, просто создайте экземпляр de Dialog и верните его. Это должно работать! (У меня возникли проблемы с использованием showDialog () из onCreate () - фактически не показывающего диалог-, но если вы используете его в onResume () или в обратном вызове слушателя, он работает хорошо).источник
AlertDialog.Builder
. Если вы используете его внутриonCreateDialog()
, вместо использованияshow()
верните результатcreate()
. Вshow()
противном случае вызовите и сохраните возвращенный AlertDialog в атрибуте Activity и вonPause()
dismiss()
нем, если он отображается, чтобы избежать WindowLeak. Надеюсь, поможет!На этот вопрос давным-давно был дан ответ.
Тем не менее, это не взломано и просто решение, которое я использую для себя.
Я сделал этот вспомогательный класс для себя, так что вы также можете использовать его в своем приложении.
Использование:
Или
источник
Вы можете комбинировать методы onSave / onRestore Dialog с методами onSave / onRestore Activity, чтобы сохранить состояние диалога.
Примечание. Этот метод работает с такими «простыми» диалогами, как отображение предупреждающего сообщения. Он не будет воспроизводить содержимое WebView, встроенного в диалог. Если вы действительно хотите предотвратить закрытие сложного диалога во время вращения, попробуйте метод Chung IW.
источник
Определенно, лучший подход - использовать DialogFragment.
Вот мое решение класса оболочки, которое помогает предотвратить отклонение различных диалогов в одном фрагменте (или Activity с небольшим рефакторингом). Кроме того, это помогает избежать массового рефакторинга кода, если по каким-либо причинам
AlertDialogs
в коде много разбросанных с небольшими различиями между ними с точки зрения действий, внешнего вида или чего-то еще.Когда дело доходит до Activity, вы можете вызвать его
getContext()
внутриonCreateDialog()
, передать егоDialogProvider
интерфейсу и запросить конкретный диалог с помощьюmDialogId
. Вся логика работы с целевым фрагментом должна быть удалена.Использование из фрагмента:
Полную версию статьи вы можете прочитать в моем блоге. Как предотвратить закрытие диалога? и поиграйте с исходным кодом .
источник
Кажется, что это все еще проблема, даже если «все делать правильно» и
DialogFragment
т. Д.В Google Issue Tracker есть ветка, в которой утверждается, что это связано с тем, что в очереди сообщений осталось старое сообщение об отклонении. Предоставленный обходной путь довольно прост:
Невероятно, но это все еще необходимо спустя 7 лет после того, как об этой проблеме впервые было сообщено.
источник
У меня была аналогичная проблема: при изменении ориентации экрана
onDismiss
был вызван слушатель диалога, даже если пользователь не закрыл диалог. Мне удалось обойти это, вместо этого используяonCancel
прослушиватель, который запускался как при нажатии пользователем кнопки «Назад», так и при касании пользователя вне диалогового окна.источник
Просто используйте
и приложение будет знать, как обрабатывать поворот и размер экрана.
источник