Вопрос по android, android-dialogfragment – Как правильно закрыть DialogFragment?

100

Документы говорят это дляdismiss() метод изDialog учебный класс:

Dismiss this dialog, removing it from the screen. This method can be invoked safely from any thread. Note that you should not override this method to do cleanup when the dialog is dismissed, instead implement that in onStop().

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

Ваш Ответ

6   ответов
1

Kotlin Version Терельский ответ

(fragmentManager.findFragmentByTag(TAG) as? DialogFragment)?.dismiss()
1

Вы должны уволить васDialog вonPause() так что переопределите это.

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

@Override
protected void onPause() {
    super.onPause();
    if (dialog != null && dialog.isShowing()) {
        dialog.dismiss();
    }
}
Я верю, что @PareshMayani является правильным Venky. Учебник поDialogFragment от гугл не показываетonPause() метод используется на всех. Но я думаю, что вижу, что ты делаешь. Какой смысл, хотя, если пользователь не звонитonPause(), Это когда система знает, что фрагмент вызывается. Как насчет того, когда, скажем, пользователь отменяет. Какой лучший способ закрыть это в этом случае? Andy
Я думаю, что это работает как для Dialog, так и для DialogFragments @PareshMayani
он уже написал, что делает dismiss () и о DialogFragment.
62

Я думаю, что лучший способ закрытьDialogFragment это:

Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog");
if (prev != null) {
    DialogFragment df = (DialogFragment) prev;
    df.dismiss();
}

Таким образом, вам не нужно держать ссылку наDialogFragment и может закрыть его отовсюду.

163

tl;dr: Правильный способ закрытьDialogFragment это использоватьdismiss() directly on the DialogFragment.


Details:документация DialogFragment состояния

Control of the dialog (deciding when to show, hide, dismiss it) should be done through the API here, not with direct calls on the dialog.

Таким образом, вы не должны использоватьgetDialog().dismiss(), так как это вызвало быdismiss() on the dialog, Вместо этого вы должны использоватьdismiss() метод самого DialogFragment:

public void dismiss()

Dismiss the fragment and its dialog. If the fragment was added to the back stack, all back stack state up to and including this entry will be popped. Otherwise, a new transaction will be committed to remove the fragment.

Как вы можете видеть, это заботится не только о закрытии диалога, но и об обработке фрагментных транзакций, вовлеченных в процесс.

Вам нужно только использоватьonStop если вы явно создали какие-либо ресурсы, требующие ручной очистки (закрытие файлов, закрытие курсоров и т. д.). Даже тогда я бы переопределилonStop ДиалогФрагмент, а неonStop основного диалога.

@CharlesMadere в те дни, вы нашли решение?
@ScootrNova: Это не должно быть, возможно, у вас есть ошибка в другом месте. Как вы создаете фрагмент?
@ScootrNova: Хм, я не вижу в этом ничего плохого - с другой стороны, я никогда не использовал библиотеку совместимости, поэтому я не могу быть уверен в этом. Может быть, имеет смысл создать минимальный самостоятельный пример и начать новый вопрос по этому вопросу.
protected void showDialogFragment(final DialogFragment fragment) {final FragmentTransaction fTransaction = getSupportFragmentManager().beginTransaction(); fTransaction.addToBackStack(null); fragment.show(fTransaction, "dialog");}  Извините за неприятный лайнер! Но да, возможно, вы правы, поэтому на данный момент я написал другой способ закрыть мои фрагменты диалога. Я уволил их с помощью метода dismiss (), просто найдя фрагмент по тегу и запустив на нем dismiss (), если он не был нулевым. Да, и яnewфрагмент перед тем, как передать его этому методу.
К сожалению, это приводит к тому, что моя сдерживающая активность заканчивается ...
2

Я дал ответ на вопрос Тереля. Я просто хотел опубликовать это для любых пользователей Kotlin:

supportFragmentManager.findFragmentByTag(TAG_DIALOG)?.let {
    (it as DialogFragment).dismiss()
}
0

Почему бы вам не попробовать использовать только этот код:

dismiss();

Если вы хотите удалить фрагмент диалога самостоятельно. Вы можете просто поместить этот код внутри фрагмента диалога, где вы хотите закрыть диалог.

Например:

button.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       dismiss();
   }
});

Это закроет последний фрагмент диалога, который отображается на экране.

Надеюсь, это поможет вам.

Похожие вопросы