Как правильно закрыть DialogFragment?
документы говорят это для dismiss() метод Dialog класс:
закройте это диалоговое окно, удалив его с экрана. Этот метод может быть вызван
безопасно от любой нити. Обратите внимание, что вы не должны переопределять этот метод, чтобы сделать
очистка при закрытии диалогового окна, вместо этого реализовать это вonStop().
в моем коде, все, что я делаю, это вызов getDialog().dismiss() чтобы уволить его. Но я больше ничего не делаю и даже не использую onStop(). Так я и есть спрашиваю именно как правильно уволить DialogFragment чтобы избежать утечек памяти, и т. д..
3 ответов:
tl; dr: правильный способ закрыть a
DialogFragmentиспользоватьdismiss()непосредственно на DialogFragment.
подробности: The документация DialogFragment государства
управление диалогом (решение, когда показывать, скрывать, отклонять его) должно выполняться через API здесь, а не с прямыми вызовами диалогового окна.
таким образом, вы не должны использовать
getDialog().dismiss(), Так что бы вызватьdismiss()в диалоговом окне. Вместо этого, вы должны использоватьdismiss()метод самого DialogFragment:public void dismiss ()
отклонить фрагмент и его диалог. Если фрагмент был добавлен в задний стек, все состояние заднего стека до и включая эту запись будет выскочил. В противном случае будет совершена новая транзакция для удаления фрагмента.
как вы можете видеть, это занимает заботьтесь не только о закрытии диалога, но и об обработке фрагментных транзакций, участвующих в процессе.
вам нужно использовать
onStopесли вы явно создали какие-либо ресурсы, требующие ручной очистки (закрытие файлов, закрытие курсоров и т. д.). Даже тогда я бы переопределилonStopдиалогового фрагмента, а неonStopосновного диалогового окна.
Я думаю, что лучший способ закрыть
DialogFragmentэто:Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog"); if (prev != null) { DialogFragment df = (DialogFragment) prev; df.dismiss(); }таким образом, вы не должны держать ссылку на
DialogFragmentи может закрыть его ото всюду.
вы должны уволить вы
DialoginonPause()так переопределить его.также перед увольнением вы можете проверить
nullи показывает, как показано ниже фрагмент:@Override protected void onPause() { super.onPause(); if (dialog != null && dialog.isShowing()) { dialog.dismiss(); } }
Comments