Answers:
tl; dr:关闭a的正确方法DialogFragment
是dismiss()
直接在DialogFragment上使用。
详细信息:DialogFragment状态的文档
对话框的控制(决定何时显示,隐藏,关闭它)应该通过此处的API来完成,而不是直接在对话框上进行调用。
因此,您不应使用getDialog().dismiss()
,因为那样会dismiss()
在dialog上调用。相反,您应该使用dismiss()
DialogFragment本身的方法:
公共无效dismiss()
关闭片段及其对话框。如果将片段添加到后堆栈,则将弹出直至该条目的所有后堆栈状态。否则,将提交一个新事务以删除该片段。
如您所见,这不仅需要关闭对话框,还需要处理流程中涉及的片段事务。
仅onStop
当您明确创建了需要手动清除的资源(关闭文件,关闭游标等)时,才需要使用。即使这样,我还是会覆盖onStop
DialogFragment而不是onStop
基础Dialog。
protected void showDialogFragment(final DialogFragment fragment) {final FragmentTransaction fTransaction = getSupportFragmentManager().beginTransaction(); fTransaction.addToBackStack(null); fragment.show(fTransaction, "dialog");}
对不起,令人讨厌的一班轮!但是,是的,您可能是对的,因此暂时我已经写出了另一种关闭DialogFragments的方法。我使用dismiss()方法消除它们的方式是按标签查找片段,然后在不为null的情况下对其运行dismiss()。哦,是的,我正在new
将片段传递给该方法之前。
为什么不尝试仅使用以下代码:
dismiss();
如果要自行关闭对话框片段。您可以简单地将此代码放在要关闭该对话框的对话框片段中。
例如:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
这将关闭屏幕上显示的最新对话框片段。
希望对您有帮助。
我对Terel的回答表示赞同。我只是想将其发布给所有Kotlin用户:
supportFragmentManager.findFragmentByTag(TAG_DIALOG)?.let {
(it as DialogFragment).dismiss()
}
您应该解雇您Dialog
,onPause()
以便对其进行覆盖。
另外,在解雇之前,您可以检查null
并显示如下代码段所示:
@Override
protected void onPause() {
super.onPause();
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
DialogFragment
Google上的教程完全没有显示onPause()
所使用的方法。但是我想我知道你在做什么。但是,如果用户不打电话,那有什么意义呢onPause()
?多数民众赞成在系统知道片段正在被调用时。比如说用户取消了。在这种情况下,关闭它的更好方法是什么?
在其他答案中也有对官方文档的引用(DialogFragment Reference),但没有提及此处给出的示例:
void showDialog() {
mStackLevel++;
// DialogFragment.show() will take care of adding the fragment
// in a transaction. We also want to remove any currently showing
// dialog, so make our own transaction and take care of that here.
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel);
newFragment.show(ft, "dialog");
}
这将删除当前显示的所有对话框,创建带有参数的新DialogFragment,并将其显示为后堆栈上的新状态。弹出事务时,当前的DialogFragment及其Dialog将被销毁,并重新显示前一个(如果有的话)。请注意,在这种情况下,DialogFragment将负责弹出对话框的事务,而Dialog的事务则与之分开。
为了我的需要,我将其更改为:
FragmentManager manager = getSupportFragmentManager();
Fragment prev = manager.findFragmentByTag(TAG);
if (prev != null) {
manager.beginTransaction().remove(prev).commit();
}
MyDialogFragment fragment = new MyDialogFragment();
fragment.show(manager, TAG);
除了其他答案外,当DialogFragment
全屏调用dismiss()
时,不会从片段返回堆栈弹出DialogFragment。一种解决方法是调用onBackPressed()
父活动。
像这样:
CustomDialogFragment.kt
closeButton.onClick {
requireActivity().onBackPressed()
}
只需从您要关闭的片段中调用dismiss()即可。
imageView3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});
CustomFragment dialog = (CustomDataFragment) getSupportFragmentManager().findFragmentByTag("Fragment_TAG");
if (dialog != null) {
dialog.dismiss();
}