如何正确解雇DialogFragment?

And*_*ndy 107 android android-dialogfragment

文档dismiss()Dialog类中说出这个方法:

关闭此对话框,将其从屏幕上删除.可以从任何线程安全地调用此方法.请注意,在关闭对话框时,不应该覆盖此方法以进行清理,而是在其中实现onStop().

在我的代码中,我所做的只是打电话getDialog().dismiss()来解雇它.但我没有做任何其他事情,甚至没有使用onStop().所以我问到究竟如何正确解雇a DialogFragment以避免任何内存泄漏等.

Hei*_*nzi 184

tl; dr:关闭a的正确方法DialogFragmentdismiss() 直接在DialogFragment上使用.


详细信息:DialogFragment文档说明

控制对话框(决定何时显示,隐藏,关闭它)应该通过API在这里完成,而不是直接调用对话框.

因此,您不应该使用getDialog().dismiss(),因为这将dismiss() 在对话框上调用.相反,您应该使用dismiss()DialogFragment本身的方法:

public void dismiss()

关闭片段及其对话框.如果片段被添加到后台堆栈,则将弹出所有后台堆栈状态,包括此条目.否则,将提交新事务以删除该片段.

正如您所看到的,这不仅关闭对话框,还关注处理流程中涉及的片段事务.

只有onStop在显式创建需要手动清理的任何资源(关闭文件,关闭游标等)时才需要使用.即使这样,我也会覆盖onStopDialogFragment而不是onStop底层的Dialog.

  • @ScootrNova:嗯,没有看到任何问题 - 另一方面,我从未使用兼容性库,所以我不能确定.也许创建一个最小的,自包含的例子并开始一个新问题可能是有意义的. (2认同)

Ter*_*rel 69

我认为关闭a的更好方法DialogFragment是:

Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog");
if (prev != null) {
    DialogFragment df = (DialogFragment) prev;
    df.dismiss();
}
Run Code Online (Sandbox Code Playgroud)

这样你就不必拥有对它的引用,DialogFragment并且可以从任何地方关闭它.


小智 11

为什么不尝试仅使用此代码:

dismiss();
Run Code Online (Sandbox Code Playgroud)

如果您想自行关闭对话框片段。您可以简单地将此代码放在要关闭对话框的对话框片段中。

例如:

button.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       dismiss();
   }
});
Run Code Online (Sandbox Code Playgroud)

这将关闭屏幕上显示的最近的对话框片段。

希望对你有帮助。


Jus*_*ris 5

I gave an upvote to Terel's answer. I just wanted to post this for any Kotlin users:

supportFragmentManager.findFragmentByTag(TAG_DIALOG)?.let {
    (it as DialogFragment).dismiss()
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*hil 5

Kotlin 版本的 Terel 答案

(fragmentManager.findFragmentByTag(TAG) as? DialogFragment)?.dismiss()
Run Code Online (Sandbox Code Playgroud)