如何关闭Android的AlertDialog?

44

我正在开发一个问答游戏,需要用户回答全部问题后才能继续。当用户没有回答所有问题时,我会显示一个简单的提示框告知用户。但问题是,无论我做什么,都不能让提示框关闭。为什么dialog.cancel不起作用?这是代码:

AlertDialog.Builder ad = new AlertDialog.Builder(this);  
ad.setTitle("Unanswered Questions");  
ad.setMessage("You have not answered all the questions.");   
ad.setPositiveButton("OK", new DialogInterface.OnClickListener() {  
   public void onClick(DialogInterface dialog, int id) {  
     dialog.cancel(); 
}  
});  
ad.show(); 

2
请将您的代码放在代码标签中,以便问题易于阅读。 - jacknad
应该可以工作。我建议您尝试逐步调试并查看是否调用了ad.show()方法。还有onClick方法也要检查。 - achie
15个回答

90

AlertDialog.Builder本身不包含dismiss()cancel()方法。

它是一个方便的类,帮助您创建一个对话框,该对话框访问这些方法的权限。

下面是一个示例:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 

AlertDialog alert = builder.create();

alert.show();
你可以在警报对象上调用alert.cancel()方法(而不是构建器)。

2
当使用构建器进行构建时,如何在单击侦听器上使用警报?请解释。 - Ben Sewards
1
我的Java有点生疏,但你需要先创建AlertDialog对象,然后在AlertDialog对象上调用setButton(BUTTON_POSITIVE, "OK", DialogInterface.OnClickListener listener)。 http://developer.android.com/reference/android/app/AlertDialog.html#setButton%28int,%20java.lang.CharSequence,%20android.content.DialogInterface.OnClickListener%29 - PowerAktar
上面答案中的代码完全可行,应该是正确的答案。 - Piyush-Ask Any Difference
关键在于事件方法将对话框作为参数传递,因此即使您尚未创建它,当事件发生时,您将拥有一个有效的对话框对象。 - Brill Pappin
AlertDialog alert; 放在你的声明中,在你创建 AlertDialog 的代码的末尾使用:alert = builder.create(); alert.show(); 这将使你可以在 Activity 的任何地方使用 alert.cancel();alert.dismiss(); 从视图中删除 AlertDialog。 - VikingGlen
显示剩余2条评论

32

尝试使用

dialog.dismiss()

代替使用

dialog.cancel()


1
谢谢回复。我已经尝试了dialog.dismiss(),但也没有用。所以我想我必须尝试一下achie的建议,逐步调试每个步骤,因为我的代码看起来是正确的。 - Engmex
5
dismiss()方法不适用于AlertDialog,只适用于常规对话框。 - Mathias Conradt

11

使用“设为负数”按钮,无需“设为正数”按钮!我保证你会获胜 x


11

把这行代码放在OnCreate()中。

Context mcontext = this;    
并在接下来的代码中使用此变量。
final AlertDialog.Builder alert = new AlertDialog.Builder(mcontext);
alert.setTitle(title);
alert.setMessage(description);
alert.setPositiveButton("Ok",
    new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
alert.show();

尝试使用这段代码,它已经成功运行。


6
AlertDialog.Builder ad = new AlertDialog.Builder(this);  
ad.setTitle("Unanswered Questions");  
ad.setMessage("You have not answered all the questions.");   
ad.setPositiveButton("OK", new DialogInterface.OnClickListener() {  
   public void onClick(DialogInterface dialog, int id) {  
     dialog.dismiss(); 
}  
});  
ad.show(); 

5
回复一篇旧帖,但希望有人会发现这很有用。请改为执行以下操作。
final AlertDialog builder = new AlertDialog.Builder(getActivity()).create();

您可以继续进行以下操作:
builder.dismiss();

2

使用Dialog代替AlertDialog

AlertDialog没有dismiss()方法,但是AlertDialog有一些针对按钮的方法,如setPositiveButton()

如果你想要自定义对话框,我建议使用Dialog。


2

如果有人正在寻找此问题的Kotlin版本,以下是代码:

Original Answer翻译成"最初的回答"

alertDialog.setPositiveButton(resources.getString(R.string.split_okay)) { 
    dialog, _ ->
        dialog.dismiss()
}

2
AlertDialog.Builder builder = new AlertDialog.Builder(this); 
AlertDialog alert = builder.create(); 
alert.show();

上述代码可以工作,但请确保将 alert 声明为全局变量,以便您可以从 onClick 方法内部访问它。

不需要全局变量来记住对话框。您可以在onclick方法的第一个参数中获取它。 - Bananeweizen
如果你想在其他地方解除它,那么需要这个。这是正确的方法,特别是在实现AlertDialog.OnClickListener时。 - Yousha Aleayoub

1

我会尝试放置一个

Log.e("SOMETAG", "dialog button was clicked");

在你的代码中,在dialog.dismiss()行之前插入一些代码,以查看它是否实际到达该部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接