2012-06-26 214 views
79

文档说这个从Dialogdismiss()方法:如何正确关闭DialogFragment?

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以避免任何内存泄漏等。

回答

136

TL;博士:正确的方法关闭DialogFragment是对DialogFragment使用dismiss()直接。


详细:本documentation of DialogFragment状态对话框

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

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

公共无效解雇()

辞退的片段和其对话。如果片段被添加到后端堆栈,则将弹出所有后退堆栈状态直到并包括该条目。否则,一个新的事务将被提交去除片段。

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

如果您明确创建了需要手动清理(关闭文件,关闭游标等)的资源,则只需使用onStop。即使那样,我也会覆盖DialogFragment的onStop而不是底层Dialog的onStop

+4

不幸的是,这导致我包含的活动完成... –

+0

@ScootrNova:它不应该,你可能有其他地方的错误。你如何创建片段? – Heinzi

+0

'protected void showDialogFragment(final DialogFragment fragment){final FragmentTransaction fTransaction = getSupportFragmentManager()。beginTransaction(); fTransaction.addToBackStack(NULL); fragment.show(fTransaction,“dialog”);}' 对不起,讨厌的单线!但是,你可能是对的,所以暂时我写了另一种方式来关闭我的DialogFragments。我使用dismiss()方法解雇他们的方式是通过标签找到片段,然后在其上运行dismiss()(如果它不为null)。哦,是的,我在将这个片段传递给这个方法之前,正在对它进行新的分析。 –

0

你应该解雇你DialogonPause()所以重写它。

还解雇你可以检查null,并呈现出像下面前片段:

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

他已经写了他正在做dismiss()和它的关于DialogFragment。 –

+0

我认为这适用于对话框和DialogFragments @PareshMayani – Venky

+2

我相信@PareshMayani是正确的Venky。 google的'DialogFragment'教程根本没有显示所使用的'onPause()'方法。但我想我明白你在做什么。但是,如果用户没有调用'onPause()',那有什么意义呢?那就是当系统知道片段被叫走时。用户取消时怎么办?在这种情况下最好的办法是关闭它? – Andy

48

我认为更好的方式来关闭一个DialogFragment是这样的:

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

这样,你没有持有到DialogFragment一个参考,可以从任何地方关闭它。