繁体   English   中英

DisogFragment被取消时的回调

[英]Callback When DialogFragment is Dismissed

我想启动一个带有自定义布局的对话框,我已经通过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。 根据这个SO答案的建议,我调用了executePendingTransaction()。 这会在B行导致IllegalStateException,并且消息“OnDismissListener已被DialogFragment占用,无法替换。” 我也尝试在调用show()之前放入setOnDismissListener(),但这总是导致NullPointerException。

然后我读了另一个SO答案 ,其中说原始提问者“在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)实现此接口。 然后给DialogFragment提供以下方法:

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

有人做同样的更多解释性代码。

创建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
        }
};

DismissListenerDialogFragement作为

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);
        }

    }

泰勒的例子是我能找到的唯一可行的例子。 为示例工作需要更改的唯一事情是调用DialogFragment类中的DismissListner方法。 他有:

dialogFragementObject.DismissListner(closeListener);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM