如何知道一个对话框是不是在 Android 中被关闭?

Posted

技术标签:

【中文标题】如何知道一个对话框是不是在 Android 中被关闭?【英文标题】:How to know if a dialog is dismissed in Android?如何知道一个对话框是否在 Android 中被关闭? 【发布时间】:2013-07-06 20:36:25 【问题描述】:

如果对话框被关闭,我想为我的背景做点什么。所以我想知道对话框是否被关闭

【问题讨论】:

如果您不希望收到任何数据但只想知道对话框消失了,这可能会有所帮助:gist.github.com/CrandellWS/ac79d3864a96344d204d869d64fd1922 【参考方案1】:

您可以使用onDismissListener

http://developer.android.com/reference/android/content/DialogInterface.OnDismissListener.html

public Dialog createDialog() 
    Dialog d = new Dialog(this);
    d.setOnDismissListener(new OnDismissListener() 
        @Override
        public void onDismiss(final DialogInterface arg0) 
            // do something
        
    );
    return d;

如果您使用的是DialogFragment,只需覆盖onDismiss()

http://developer.android.com/reference/android/app/DialogFragment.html#onDismiss(android.content.DialogInterface)

【讨论】:

太棒了,但它没有得到设备被旋转的情况 - 这会杀死对话框。有什么想法吗? @JoeBlow 当设备旋转并重新创建活动时,onCreate 将被调用,Bundle savedInstanceState 将不等于 null。您可以在onsaveInstanceState 中存储任何状态(例如,对话框是否在设备旋转之前显示的布尔值)并在此处引用。 很好的答案。不幸的是,setOnDismissListener 仅支持 API 17+。有没有针对早期 API 版本的方法? setOnDismissListener 我相信自 API 级别 1 起就可用。 developer.android.com/reference/android/app/… 奇怪,Android Studio 一直在抱怨。不过还是谢谢。【参考方案2】:

@Ken Wolf 对这个问题有很好的回答。

只是想补充一点,onDismissListener 仅在 API 17 中引入。如果你想支持更低的东西,你可以使用onCancelListener,它不是那么好,但涵盖了 backButton 和在 AlertDialog 之外点击等情况。

http://developer.android.com/reference/android/content/DialogInterface.OnCancelListener.html#onCancel(android.content.DialogInterface)

public Dialog createDialog() 
    Dialog d = new Dialog(this);
    d.setOnCancelListener(new DialogInterface.OnCancelListener() 
        @Override
        public void onCancel(DialogInterface dialog) 
            // do something
        
    );

【讨论】:

【参考方案3】:

我注意到即使您选择警报中的选项之一(是/否/中性按钮),也会调用 onDismissListener。对我来说,onCancelListener 是最好的选择,因为我需要通过点击警报区域外来跟踪对话框的显式关闭。

【讨论】:

【参考方案4】:

当对话框关闭时,您可以在下面的代码中使用dialog.setOnDismissListener,并使用更新的对话框代码。

private void ShowDialog()       
            View view = LayoutInflater.from(ActivityMain.this).inflate(R.layout.dialog, null);
            dialog = new Dialog(ActivityMain.this);
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setCancelable(true);
            dialog.setCanceledOnTouchOutside(true);
            dialog.addContentView(view, new RelativeLayout.LayoutParams(
                        WindowManager.LayoutParams.WRAP_CONTENT,
                        WindowManager.LayoutParams.WRAP_CONTENT));
            Button dialogBtn = (Button) dialog.findViewById(R.id.button);
            dialogBtn.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    dialog.dismiss();                
                
            );
            dialog.setOnDismissListener(new DialogInterface.OnDismissListener() 
                @Override
                public void onDismiss(final DialogInterface arg) 
                    //when dialog closed
                
            );

    

【讨论】:

以上是关于如何知道一个对话框是不是在 Android 中被关闭?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 android 复选框是不是在其 onClick 方法中被选中(在 XML 中声明)?

如何检查单选按钮是不是在 Android 的单选组中被选中?

如何知道设备是不是在 Windows 中被访问?

让我的单选按钮在 Android 中被选中

如果在后台使用位置,更新到 Android 11 是不是需要应用显示另一个位置权限对话框?

如何检查是不是启用了定位服务?