DialogFragment关闭事件

12
我需要处理DialogFragment的结束(在调用.dismiss后)-例如,我会在活动中显示一个toast,该活动“包含”片段dismiss后。
我该如何处理这个事件?

你想在对话框关闭后,通过toast来显示它吗? - Austyn Mahoney
是的,这正是我想要做的。 - giozh
3个回答

26
在您的DialogFragment中覆盖onDismiss()方法,或者在构建该片段的代码块中使用setOnDismissListener()方法。

参考文献提到了要重写onDismiss。现在我有另一个问题。我该如何检索主视图上下文以创建toast? - giozh
如果您创建另一个问题来询问如何获取上下文,每个人都会受益。您可能还可以找到其他已经回答了这个问题的答案。 - Austyn Mahoney

16

我遇到了类似的问题,但我想通知另一个活动关于对话框解散的情况(而不是创建和显示对话框的活动)。

尽管您可以像Austyn Mahoney建议的那样仅覆盖您的DialogFragment中的 onDismiss()方法,但您不能使用 setOnDismissListener(),因为DialogFragment简单地没有提供此方法(根据:Android Developers DialogFragment Reference)。

但仍然有另一种很好的方法来通知任何其他活动关于对话框解散,(我在这里找到了它:DialogFragment and onDismiss),它来了:

首先,您应该使您的 Activity(您想传递有关对话框解散信息的那个 Activity)实现 OnDismissListener

public final class YourActivity extends Activity implements DialogInterface.OnDismissListener {

    @Override
    public void onDismiss(final DialogInterface dialog) {
        //Fragment dialog had been dismissed
    }

}
根据Android开发者对话框片段参考文献,DialogFragment已经实现了具有onDismiss()方法的OnDismissListener。因此,您应该覆盖它并在其中调用您在YourActivity中实现的onDismiss()方法:
public final class DialogFragmentImage extends DialogFragment {

    @Override
    public void onDismiss(final DialogInterface dialog) {
        super.onDismiss(dialog);
        final Activity activity = getActivity();
        if (activity instanceof DialogInterface.OnDismissListener) {
            ((DialogInterface.OnDismissListener) activity).onDismiss(dialog);
        }
    }

}

在 onDismiss(..) 方法中,如果我有多个对话框,如何识别其中一个对话框? - Anthea
当对话框被关闭时,系统会在onDismiss(final DialogInterface dialog)参数中传递对已关闭对话框的引用。请参阅:http://developer.android.com/reference/android/app/DialogFragment.html#onDismiss(android.content.DialogInterface) - Krzysiek

2
在你的DialogFragment中,你可以使用以下代码:
lateinit var onDismissListener : () -> Any

override fun onDismiss(dialog: DialogInterface) {
    if (this::onDismissListener.isInitialized) {
        onDismissListener()
    }

    super.onDismiss(dialog)
}

然后在创建对话框的片段中:

val dialog = DialogFragment()
dialog.onDismissListener = {
      Toast.makeText(context, "Dismissed", Toast.LENGTH_SHORT).show()
}

dialog.show(context.supportFragmentManager, "tag")

嗨,@NeverEndingQueue,我该如何做类似的东西来返回值或接受按钮按下? - Víctor Martín
我不确定,但你可能可以将对话框传递给监听器:onDismissListener(dialog),然后在你的 onDismissListener = {} 中,你可能可以找出该值。 - NeverEndingQueue
我不确定,但你可能可以将对话框传递给监听器:onDismissListener(dialog),然后在你的onDismissListener = {}中,你可能可以找出这个值。 - Tom Raganowicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接