【问题标题】:Callback When DialogFragment is DismissedDialogFragment 关闭时的回调
【发布时间】:2014-07-31 20:37:32
【问题描述】:

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

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

我的尝试

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

接下来,我尝试在对话框中添加一个 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 之外,我还应该使用其他东西吗?

【问题讨论】:

  • 是否有必要 Activity 完成工作并试图找出对话框的状态?当它关闭时,从 DialogFragment 向其所有者 Activity 发送通知可能会更容易。即如果 SomeCallback 是带有回调方法的接口,则在需要通知的活动中实现它。在 DialogFragment 中,您可以覆盖 onDismiss(DialogInterface) 以检查 getActivity() 是否返回 SomeCallback 的实例 - 如果是 - 调用接口方法。
  • 我刚刚从片段中创建了一个界面,这与@harism 所说的相同。 stackoverflow.com/questions/24149696/…
  • @harism 是有道理的;有机会我会试试这个。
  • harism 的独奏对我有用。我还没有代表将其发布为答案。

标签: android dialog


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 不错。我会在getActivity() 之前检查getParentFragment() 以支持嵌套片段。
  • 太棒了!谢谢朋友
【解决方案2】:

更多解释代码供某人做同样的事情。

interface 创建为:

package com.example.dialoglistener;
import android.content.DialogInterface;

public interface MyDialogCloseListener {
    public void handleDialogClose(DialogInterface dialog);
}

在activity中实现接口为:

MyDialogCloseListener closeListener = new MyDialogCloseListener() {
        @Override
        public void handleDialogClose(DialogInterface dialog) {                                     
            //do here whatever you want to do on Dialog dismiss
        }
};

DialogFragement 中写一个DismissListener

public void DismissListener(MyDialogCloseListener closeListener) {
        this.closeListener = closeListener;
}

从您的活动中调用DismissListener

dialogFragementObject.DismissListener(closeListener);

最后写onDismiss方法

@Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        if(closeListener != null) {
            closeListener.handleDialogClose(null);
        }

    }

【讨论】:

  • this.closeListener 未被识别
  • @ChrisJKikoti 因为错过了接口对象声明:private MyDialogCloseListener closeListener;
【解决方案3】:

Tyler 的例子是我能找到的唯一有效的例子。要使示例正常工作,唯一需要更改的是调用 DialogFragment 类中的 DismissListner 方法。他有它:

dialogFragementObject.DismissListner(closeListener);

这只需要转换为该 DialogFragment 的类名。例如:

((MyDialogFragment)dialogFragementObject).DismissListner(closeListener);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-03
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多