android - DialogFragment 关闭时的回调

标签 android dialog

我想启动一个具有自定义布局的对话框,我通过 DialogFragment 实现了该布局。 (我基本上只是更改了 onCreateView() 并添加了按钮处理程序)。该对话框让用户可以快速更改重要设置。

此对话框将从几个不同的 Activity 中启动。不同的 Activity 没有太多共同点,只是它们需要在用户更改设置后刷新。他们不需要从对话框中获取任何信息;他们只需要知道它何时关闭(解雇)。

我的尝试

我尝试在 onResume() 中刷新 Activity ,但启动和关闭对话框似乎从未调用此方法。 (所以我不确定它为什么存在,但这可能是另一个问题的主题。)

接下来,我尝试在对话框中添加一个 DialogInterface.OnDismissListener:

public static void showMyDialog(OnDismissListener listener, Activity activity)
{
    DialogFragment fragment = new MyDialogFragment();
    fragment.show(activity.getFragmentManager(), "date");
    activity.getFragmentManager().executePendingTransactions();//A
    fragment.getDialog().setOnDismissListener(listener);//B
}

当我最初忽略 A 行时,我在 B 行得到了 NullPointerException,因为此时对话框为空。听从 this SO answer 的建议,我调用了executePendingTransaction()。这会导致 B 行出现 IllegalStateException,并显示消息“OnDismissListener 已被 DialogFragment 占用,无法替换。”我还尝试在调用 show() 之前放置 setOnDismissListener(),但这总是会导致 NullPointerException。

然后我读到 this other SO answer ,它表示最初的询问者“在 DialogFragment 的生命周期中过早地调用 getDialog()”。所以我尝试向我的 DialogFragment 添加一个构造函数:

public MyDialogFragment(SomeCallback illTakeAnythingICanGet)
{
    //I'll store the callback here and call it later
}

不幸的是,添加一个构造函数让 Android Lint 因致命警告而崩溃,当我查找它时,我在 this question 中发现了一条评论这似乎是说这种方法将无法在对话框打开时处理用户旋转屏幕。

问题

如果用户旋转屏幕,Activity 如何确定 DialogFragment 何时关闭(被解除),并且不会破坏我的应用程序?除了 DialogFragment 之外,我还应该使用其他东西吗?

最佳答案

这只是对harism评论的更长解释,以防其他人遇到与我相同的问题。

你可以通过创建这样的界面来完成我想要的:

public interface MyDialogCloseListener
{
    public void handleDialogClose(DialogInterface dialog);//or whatever args you want
}

让启动对话框的 Activity (DialogFragment) 实现此接口(interface)。然后给那个DialogFragment下面的方法:

public void onDismiss(DialogInterface dialog)
{
    Activity activity = getActivity();
    if(activity instanceof MyDialogCloseListener)
        ((MyDialogCloseListener)activity).handleDialogClose(dialog);
}

关于android - DialogFragment 关闭时的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24151891/

相关文章:

android - 如何设置对话框标题引力?

java - 低于 17 的 API 的 Android AlertDialog setOnDismissListener

android - 使用 androidx NotificationManagerCompat 无法解析符号 'from'

java - 如何找到 assetManager.openFd() 的正确文件路径?

java - ListView 单击和长按

android - 适用于 Android 和桌面的 Chrome 扩展程序?

android - 如何避免返回堆栈中的 fragment 的多个实例?

javascript - 在 xamarin Android CrossWalk Web View 中启用 javascript 警报对话框

android - 当显示键盘时,我的 Android AlertDialog 没有向上移动

c# - 单击任务栏中的应用程序图标时 WPF 中的对话框消失