Как правильно закрыть DialogFragment?



документы говорят это для dismiss() метод Dialog класс:




закройте это диалоговое окно, удалив его с экрана. Этот метод может быть вызван
безопасно от любой нити. Обратите внимание, что вы не должны переопределять этот метод, чтобы сделать
очистка при закрытии диалогового окна, вместо этого реализовать это в onStop().




в моем коде, все, что я делаю, это вызов getDialog().dismiss() чтобы уволить его. Но я больше ничего не делаю и даже не использую onStop(). Так я и есть спрашиваю именно как правильно уволить DialogFragment чтобы избежать утечек памяти, и т. д..

543   3  

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 и может закрыть его ото всюду.

вы должны уволить вы Dialog in onPause() так переопределить его.

также перед увольнением вы можете проверить null и показывает, как показано ниже фрагмент:

@Override
protected void onPause() {
    super.onPause();
    if (dialog != null && dialog.isShowing()) {
        dialog.dismiss();
    }
}

Comments

    Ничего не найдено.