11

我的 Android 应用程序在单击按钮时显示 AlertDialog。当我多次单击该按钮时,会创建一个以上的对话框。我怎样才能解决这个问题?

这是我的代码:

button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        dialog =  new AlertDialog.Builder(context);             
        dialog.show();
    }
});
4

7 回答 7

21

您需要检查对话框是否正在显示

Dialog 有一个 isShowing() 方法,如果对话框当前可见,该方法应该返回。

public AlertDialog myDialog;

public void showDialog(Context context) {
    if( myDialog != null && myDialog.isShowing() ) return;

    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("Title");
    builder.setMessage("Message");
    builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int arg1) {
                dialog.dismiss();
            }});
    builder.setCancelable(false);
    myDialog = builder.create();
    myDialog.show();
  }
于 2014-12-01T11:30:36.167 回答
7

如果显示对话框,您可以创建一个设置为 true 的全局标志(布尔值)?如果用户单击“确定”、“是”、“否”或任何内容,则对话框关闭并且您将标志设置为 false。

所以像:

boolean dialogShown;

If(dialogShown)
{
  return;
}
else
{
  dialogShown = true;
  dialog =  new AlertDialog.Builder(context);              
  dialog.show();
}
于 2012-09-24T08:07:19.253 回答
1

每次按下按钮,您都会调用该方法。所以这就是它被多次显示的原因。

最简单的方法是在您的代码类中定义一个实例变量,例如:

boolean alertIsBeingShown = false;

然后在像这样显示警报时将其设置为 true

button.setOnClickListener(new OnClickListener() {
           @Override
        public void onClick(View v) {
               if (alertIsBeingShown) return;
               alertIsBeingShown = true;
               dialog =  new AlertDialog.Builder(context);              
               dialog.show();

    }
 });

并在代码中将变量设置为 false,您可以在其中按 OK 使其消失。

于 2012-09-24T08:06:09.003 回答
0

为其创建一个肯定或否定按钮,然后将其称为 OK 并使用它来关闭。就像是 :

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Look at this dialog!")
       .setCancelable(false)
       .setPositiveButton("OK", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                //do things
           }
       });
AlertDialog alert = builder.create();
alert.show();
于 2012-09-24T08:06:35.320 回答
0

当我遇到这个问题时,我无法使用标志。我必须在 RecyclerView 中为单击的列表项显示一个对话框。

onclick 方法中,我为对话框创建了一个变量,然后在构建对话框时,我用 if 语句将其括起来,该语句检查 AlertDialog 变量是否为空。当用户第一次点击列表项时出现对话框,因为该变量为空,即使用户点击一个项目两次也只会出现一个对话框,因为第二次点击后AlertDialog变量不再为空。当用户关闭 AlertDialog 时,变量再次设置为 null。

AlertDialog alertDialog;

if(alertDialog == null) {

            alertDialog = new AlertDialog.Builder(MyActivity.this)
                    .setTitle("Title for Dialog")
                    .setMessage("Dialog Message")
                    .setPositiveButton("Okay", null)
                    .setNegativeButton("No", null)
                    .setOnDismissListener(new DialogInterface.OnDismissListener() {
                        @Override
                        public void onDismiss(DialogInterface dialogInterface) {

                            alertDialog = null;

                        }
                    })
                    .show();
        }
于 2019-07-08T12:38:29.597 回答
0
boolean dialogShown;

if (!dialogShown) {

  dialogShown = true;
  dialog =  new AlertDialog.Builder(context);  
  dialog .setNegativeButton(...)
  dialog .setCancelable(false);
  dialog.show();
}

内部否定点击:

dialogShown=false;
于 2020-02-21T02:55:38.303 回答
-1

在 try-catch-block 中创建对话框,如下所示:

    try {
        dialog.setVisible(true);
    } catch (NullPointerException e) {
        dialog =  new AlertDialog.Builder(context);              
        dialog.show();
    }

第一次执行此操作时,会引发 NullPointerException 并创建对话框。在接下来的时间里,什么都不会真正发生。

于 2013-06-13T09:57:52.340 回答