tl; dr: Правильный способ закрыть a DialogFragment
- использовать dismiss()
непосредственно в DialogFragment .
Подробности : в документации DialogFragment говорится
Управление диалоговым окном (принятие решения о том, когда его показать, скрыть или закрыть) должно осуществляться через API, а не с помощью прямых вызовов диалогового окна.
Таким образом, вы не должны использовать getDialog().dismiss()
, так как это вызовет dismiss()
диалоговое окно . Вместо этого вы должны использовать dismiss()
метод самого DialogFragment:
общественная недействительность увольнение ()
Закройте фрагмент и его диалог. Если фрагмент был добавлен в задний стек, все состояния заднего стека до этой записи включительно будут извлечены. В противном случае будет зафиксирована новая транзакция для удаления фрагмента.
Как видите, это касается не только закрытия диалогового окна, но и обработки транзакций фрагментов, участвующих в процессе.
Вам нужно использовать только в том onStop
случае, если вы явно создали какие-либо ресурсы, требующие ручной очистки (закрытие файлов, закрытие курсоров и т. Д.). Даже тогда я бы переопределил onStop
DialogFragment, а не onStop
лежащий в основе Dialog.
protected void showDialogFragment(final DialogFragment fragment) {final FragmentTransaction fTransaction = getSupportFragmentManager().beginTransaction(); fTransaction.addToBackStack(null); fragment.show(fTransaction, "dialog");}
Извините за неприятный лайнер! Но да, вы могли быть правы, поэтому пока я написал другой способ закрыть мои DialogFragments. Я отклонял их с помощью метода dismiss (), просто находил фрагмент по тегу и затем запускал на нем dismiss (), если он не был нулевым. Ах да, яnew
вставляю фрагмент прямо перед тем, как передать его этому методу.Я думаю, что лучший способ закрыть
DialogFragment
это:Таким образом, вам не нужно держать ссылку на объект
DialogFragment
и закрывать его отовсюду.источник
Почему бы вам не попробовать использовать только этот код:
Если вы хотите закрыть фрагмент диалогового окна самостоятельно. Вы можете просто поместить этот код внутрь фрагмента диалогового окна, из которого вы хотите закрыть диалоговое окно.
Например:
Это закроет последний фрагмент диалогового окна, отображаемый на экране.
Надеюсь, это поможет вам.
источник
Я поддержал ответ Терел. Я просто хотел опубликовать это для всех пользователей Kotlin:
источник
Котлинская версия ответа Терел
источник
Вы должны уволить вас
Dialog
вonPause()
так переопределить его.Также перед увольнением вы можете проверить
null
и показать, как показано ниже:источник
DialogFragment
от Google вообще не показывает используемыйonPause()
метод. Но мне кажется, я понимаю, что вы делаете. В чем смысл, если пользователь не звонитonPause()
. Тогда система знает, что фрагмент вызывается. А когда, скажем, пользователь отменяет подписку. Как лучше закрыть это в таком случае?В других ответах есть ссылки на официальные документы ( DialogFragment Reference ), но нет упоминания о приведенном там примере:
Для своих нужд я изменил его на:
источник
Добавляя к другим ответам, при наличии
DialogFragment
полноэкранного вызоваdismiss()
DialogFragment не будет выталкиваться из стека фрагментов. Обходной путь - вызватьonBackPressed()
родительскую операцию.Что-то вроде этого:
CustomDialogFragment.kt
источник
Просто вызовите dismiss () из фрагмента, который хотите закрыть.
источник
Я обнаружил, что когда мой фрагмент был определен в навигационном графе с помощью
<fragment>
тега (для полноэкранного диалогового фрагмента), диалоговый фрагмент не закрывался с помощьюdismiss()
команды. Вместо этого мне пришлось вытащить задний стек:Однако, если тот же самый фрагмент диалога был определен в графе навигации с помощью
<dialog>
тега,dismiss()
работает нормально.источник
источник