Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.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 如何一次只显示一个对话框?_Android_Customdialog - Fatal编程技术网

Android 如何一次只显示一个对话框?

Android 如何一次只显示一个对话框?,android,customdialog,Android,Customdialog,我的Android应用程序在点击按钮时会显示一个AlertDialog。当我多次单击按钮时,会创建多个对话框。我怎样才能解决这个问题 这是我的密码: button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dialog = new AlertDialog.Builder(context); dial

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

这是我的密码:

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

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

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

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,按“确定”使其消失。

为其创建一个正按钮或负按钮,并将其称为“确定”,然后使用它来消除。比如:

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

您可以创建一个全局标志(布尔值),该标志在显示对话框时设置为true?如果用户单击“确定”、“是”、“否”或其他任何选项,对话框将关闭,您将标志设置为false

比如:

boolean dialogShown;

If(dialogShown)
{
  return;
}
else
{
  dialogShown = true;
  dialog =  new AlertDialog.Builder(context);              
  dialog.show();
}

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

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

第一次执行此操作时,将抛出NullPointerException并创建对话框。在以下情况下,将不会发生任何可见的情况。

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

对话框有一个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();
  }

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

onclick方法中我为对话框创建了一个变量,然后在构建对话框时,我用if语句将其括起来,该语句检查AlertDialog变量是否为null。当用户第一次单击列表项时,对话框出现,因为变量为null,即使用户两次单击一个项,也只会出现一个对话框,因为第二次单击后,AlertDialog变量不再为null。当用户取消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();
        }
内部负点击:

dialogShown=false;

我使用的不是AlertDialog.Builder,而是一个自定义类扩展了AlertDialog。它显示了一个图像。没有按钮。我猜你仍然可以使用相同的概念。只需创建一种类型的标志:)始终将块放在括号中,即使是一行。你为自己省去了很多麻烦(特别是在使用带有预处理器和宏的语言时),为什么要使用YES和NO?我猜这是一个错误的例子。错误场景(Android 9):1。展示对话。2.切换到另一个应用程序。3.在15秒内,操作系统将应用程序切换到后台模式。4.返回到应用程序-对话框将被删除,但代码认为对话框已显示:if(myDialog!=null&&myDialog.isShowing())Return;
dialogShown=false;