Google рекомендует использовать DialogFragment
вместо простого Dialog
с помощью Fragments API
, но абсурдно использовать изолированное DialogFragment
для простого окна подтверждения «да-нет». Какова лучшая практика в этом случае?
244
Dialog
илиAlertDialog.Builder::create()::show()
создаст диалоговое окно, которое исчезает при повороте экрана.Ответы:
Да, используйте,
DialogFragment
и вonCreateDialog
любом случае вы можете просто использовать AlertDialog Builder для создания простогоAlertDialog
с кнопками подтверждения Да / Нет. Не очень много кода на всех.Что касается обработки событий в вашем фрагменте, то существуют разные способы сделать это, но я просто определяю сообщение
Handler
в myFragment
, передаю его вDialogFragment
конструктор via, а затем передаю сообщения обратно в обработчик моего фрагмента в соответствии с различными событиями click. Опять разные способы сделать это, но у меня работает следующее.В диалоговом окне удерживайте сообщение и создайте его экземпляр в конструкторе:
Реализуйте
onClickListener
в своем диалоговом окне и затем вызовите обработчик соответствующим образом:редактировать
И, как
Message
можно продать, вы можете сохранить егоonSaveInstanceState
и восстановить егоЗатем в
onCreate
источник
target
которая будет нулевой, если вы загрузите ее из Bundle. Если цель сообщения равна нулю и вы используетеsendToTarget
, вы получите исключение NullPointerException - не потому, что сообщение равно нулю, а потому, что его целью является.Вы можете создавать общие подклассы DialogFragment, такие как YesNoDialog и OkDialog, и передавать заголовок и сообщение, если вы часто используете диалоги в своем приложении.
Затем позвоните, используя следующее:
И обработать результат в
onActivityResult
.источник
YES_NO_CALL
,getFragmentManager()
аonActivityResult
?YES_NO_CALL
это пользовательский int, который является кодом запроса.getFragmentManager()
получает диспетчер фрагментов для действия иonActivityResult()
является методом обратного вызова жизненного цикла фрагмента.Используйте DialogFragment поверх AlertDialog:
С момента внедрения API уровня 13 :
ShowDialog метод от деятельности является устаревшим . Вызывать диалог в другом месте кода не рекомендуется, так как вам придется управлять диалогом самостоятельно (например, изменение ориентации).
Разница DialogFragment - AlertDialog
Они так сильно отличаются? Из ссылки Android относительно DialogFragment :
Другие заметки
источник
Я бы порекомендовал использовать
DialogFragment
.Конечно, создать диалог «Да / Нет» с ним довольно сложно, учитывая, что это должно быть довольно простой задачей, но создание аналогичного диалогового окна с
Dialog
удивительно сложным также.(Жизненный цикл активности усложняет задачу - вы должны разрешить
Activity
управление жизненным циклом диалогового окна - и нет способа передать пользовательские параметры, например пользовательское сообщение,Activity.showDialog
если используются уровни API ниже 8)Приятно то, что вы, как правило,
DialogFragment
довольно легко можете создать свою собственную абстракцию на вершине .источник
String
параметр. Например, когда пользователь нажимает «Да», диалоговое окно вызывает метод Activity с параметром «accept». Эти параметры указываются при отображении диалогового окна, например AskDialog.ask («Согласны ли вы с этими условиями?», «Согласен», «не согласен»);FragmentManager
'sfindFragmentByTag
. Но да, для этого требуется немало кода.Fragment
this
и получитьActivity
extends
свойInterface
. Осторожно с многопоточностью, вы можете отбрасывать интерфейсные вызовы, когда они не нужны, если ваш параллелизм не проверяется. Не уверен, что это делает с памятью и спагетти с круговой зависимостью, кто-то еще хотел бы присоединиться? Другой вариант -Message
/Handler
но у вас все еще могут быть проблемы с параллелизмом.Общий AlertDialogFragment с шаблоном Builder
В своем проекте я
AlertDialog.Builder
уже много использовал, прежде чем обнаружил, что это проблематично. Тем не менее, я не хотел менять столько кода в моем приложении. Кроме того, я на самом деле являюсь поклонником передачи вOnClickListeners
качестве анонимных классов там, где они необходимы (то есть при использованииsetPositiveButton()
иsetNegativeButton()
т. Д.), Вместо того, чтобы реализовывать тысячи методов обратного вызова для связи между фрагментом диалога и фрагментом-держателем, который может, в моё мнение, приведёт к очень запутанному и сложному коду. Особенно, если у вас есть несколько разных диалогов в одном фрагменте, а затем нужно различать в реализациях обратного вызова, какой диалог отображается в данный момент.Поэтому я объединил разные подходы для создания универсального
AlertDialogFragment
вспомогательного класса, который можно использовать в точности такAlertDialog
:РЕШЕНИЕ
( ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ, что я использую лямбда-выражения Java 8 в своем коде, поэтому вам, возможно, придется изменить части кода, если вы еще не используете лямбда-выражения .)
ИСПОЛЬЗОВАНИЕ
Я публикую это здесь не только для того, чтобы поделиться своим решением, но и потому, что я хотел спросить вас, люди, за ваше мнение: этот подход в какой-то степени законен или проблематичен?
источник
Могу ли я предложить небольшое упрощение ответа @ ashishduh:
Это устраняет необходимость для пользователя (класса) быть знакомым с внутренними компонентами компонента и делает его использование действительно простым:
PS В моем случае мне понадобилось простое диалоговое окно с предупреждением, вот что я создал. Вы можете применить подход к Да / Нет или любому другому типу, который вам нужен.
источник
Используйте диалог для простых диалогов да или нет.
Когда вам нужны более сложные представления, в которых вам нужно овладеть жизненным циклом, таким как oncreate, запрос разрешений, любое переопределение жизненного цикла, я бы использовал фрагмент диалога. Таким образом, вы разделяете разрешения и любой другой код, который должен работать в диалоговом окне, не связываясь с активностью вызова.
источник