Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android DialogFragment被解除时的回调_Android_Dialog - Fatal编程技术网

Android DialogFragment被解除时的回调

Android DialogFragment被解除时的回调,android,dialog,Android,Dialog,我想启动一个带有自定义布局的对话框,我已经通过DialogFragment实现了这个对话框。(我基本上只是更改了onCreateView()并添加了按钮处理程序)。该对话框允许用户快速更改重要设置 此对话框将从几个不同的活动启动。不同的活动没有太多共同之处,只是在用户更改设置后需要刷新。他们不需要从对话框中获取任何信息;他们只需要知道何时关闭(解除) 我试过的 我尝试在onResume()中刷新活动,但启动和取消对话框似乎从未调用此方法。(所以我甚至不知道它为什么存在,但这可能是另一个问题的主题

我想启动一个带有自定义布局的对话框,我已经通过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,因为对话框在该点为null。按照的建议,我加入了对executePendingTransaction()的调用。这会导致第B行出现IllegalStateException,消息为“OnDismissListener已被DialogFragment接受,无法替换”。我还尝试将setOnDismissListener()放在调用show()之前,但这总是导致NullPointerException

然后我读到,上面说最初的询问者“在DialogFragment的生命周期中过早调用getDialog()”,所以我尝试向DialogFragment添加一个构造函数:

public MyDialogFragment(SomeCallback illTakeAnythingICanGet)
{
    //I'll store the callback here and call it later
}
不幸的是,添加构造器使Android Lint产生了致命的警告,当我查找它时,我在中发现一条评论,似乎说这种方法将无法处理用户在对话框打开时旋转屏幕的问题

问题
如果用户旋转屏幕,活动如何判断DialogFragment何时关闭(被取消)而不会破坏我的应用程序?除了DialogFragment之外,我还应该使用其他东西吗?

这只是对harism评论的一个较长的解释,以防其他人有与我相同的问题

通过创建如下界面,您可以实现我想要的:

public interface MyDialogCloseListener
{
    public void handleDialogClose(DialogInterface dialog);//or whatever args you want
}
让启动对话框(DialogFragment)的活动实现此接口。然后为该对话框片段提供以下方法:

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

更多的解释性代码,供其他人使用

创建
界面
,如下所示:

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

public interface MyDialogCloseListener {
    public void handleDialogClose(DialogInterface dialog);
}
将活动中的接口实现为:

MyDialogCloseListener closeListener = new MyDialogCloseListener() {
        @Override
        public void handleDialogClose(DialogInterface dialog) {                                     
            //do here whatever you want to do on Dialog dismiss
        }
};
dialogFragementObject.DismissListener(closeListener);
对话框fragement
中编写一个
DismissListener
,如下所示

public void DismissListener(MyDialogCloseListener closeListener) {
        this.closeListener = closeListener;
}
从活动中调用
DismissListener
,如下所示:

MyDialogCloseListener closeListener = new MyDialogCloseListener() {
        @Override
        public void handleDialogClose(DialogInterface dialog) {                                     
            //do here whatever you want to do on Dialog dismiss
        }
};
dialogFragementObject.DismissListener(closeListener);
最后编写
onDismiss
方法

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

    }

泰勒的例子是我能找到的唯一一个实际有效的例子。要使示例正常工作,唯一需要更改的是对DialogFragment类中DismissListner方法的调用。他说:

dialogFragementObject.DismissListner(closeListener);
这只需要对DialogFragment的类名进行强制转换。例如:

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

活动是否有必要进行工作并尝试了解对话框的状态?当DialogFragment关闭时,从DialogFragment向其所有者活动发送通知可能更容易。也就是说,如果SomeCallback是一个带有回调方法的接口,那么在需要得到通知的活动中实现它。在DialogFragment中,您可以重写onDismiss(DialogInterface),检查getActivity()是否返回SomeCallback的实例,如果是,则调用接口方法。我刚刚从一个片段创建了一个接口,这与@harism所说的是同一件事@共享是有意义的;有机会我会试试的。哈里斯的独奏对我很有用。我还没有代表将其作为答案发布。this.closeListener未被删除recognized@ChrisJKikoti因为缺少接口对象声明:
private MyDialogCloseListener不错。我会在
getActivity()
之前检查
getParentFragment()
以支持嵌套片段。Awweeessome!谢谢你,伙计