首页 > 解决方案 > 警报对话框的开始

问题描述

是否有可能(并且正确)开始AlertDialog?我的意思是AlertDialogwhere 。setPositiveButton打电话给另一个AlertDialog

如果是,两者AlertDialog可以同名吗?

例子:

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

builder
        .setMessage("Do you want to register a new account?")
        .setPositiveButton("Register", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                AlertDialog.Builder builder2 = new AlertDialog.Builder(LoginActivity.this);
                builder2
                        .setView(LoginActivity.this.getLayoutInflater().inflate(R.layout.dialog_register, null))
                        .setPositiveButton("E", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Log.i("Stefano", "2");
                            }
                        })
                        .setNegativeButton("w", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Log.i("Stefano", "3");
                            }
                        })
                        .create()
                        .show();
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                return;
            }
        })
        .create()
        .show();

标签: androidandroid-alertdialog

解决方案


是否有可能(并且正确)启动 AlertDialog?

是的,有可能。

如果是,这两个 AlertDialog 可以同名吗?

您可以拥有两个具有相同变量名称的 AlertDialog,就像使用两个具有相同名称的变量一样。它被称为阴影

如果特定范围(例如内部类或方法定义)中的类型声明(例如成员变量或参数名称)与封闭范围中的另一个声明具有相同的名称,则该声明会隐藏该声明的封闭范围。您不能仅通过名称来引用影子声明。

在您的情况下,您正在匿名类中创建另一个对话框,它是一个DialogInterface.OnClickListener. 阴影仍然适用。匿名类文档对其进行了描述:

和本地类一样,匿名类可以捕获变量;它们对封闭范围的局部变量具有相同的访问权限:

匿名类可以访问其封闭类的成员。

匿名类无法访问其封闭范围内未声明为 final 或有效 final 的局部变量。

与嵌套类一样,匿名类中的类型(例如变量)声明会隐藏封闭范围内具有相同名称的任何其他声明。有关更多信息,请参阅阴影。

因此,您可以将代码更改为以下内容:

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

builder.setMessage("Do you want to register a new account?")
    .setPositiveButton("register", new DialogInterface.OnClickListener() {
      @Override public void onClick(DialogInterface dialog, int which) {
        AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
        builder.setView(getLayoutInflater().inflate(R.layout.dialog_register, null))
            .setPositiveButton("E", new DialogInterface.OnClickListener() {
              @Override public void onClick(DialogInterface dialogInterface, int i) {
                Log.i("Stefano", "2");
              }
            })
            .setNegativeButton("w", new DialogInterface.OnClickListener() {
              @Override public void onClick(DialogInterface dialogInterface, int i) {
                Log.i("Stefano", "3");
              }
            })
            .create()
            .show();
      }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int id) {

      }
    })
    .create()
    .show();

但您最好将对话框拆分为 2 个不同的部分。为什么?因为它更容易查看并最大限度地减少您阅读和理解代码的时间。始终编​​写人类可以理解的代码。因此,将代码拆分为如下所示:

  private void showDialog() {
    final AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);

    builder.setMessage("Do you want to register a new account?")
        .setPositiveButton("register", new DialogInterface.OnClickListener() {
          @Override public void onClick(DialogInterface dialog, int which) {
            // show another dialog when clicked.
            showAnotherDialog();
          }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {

          }
        })
        .create()
        .show();
  }

  // This is the code for dialog inside your first dialog.
  private void showAnotherDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
    builder.setView(getLayoutInflater().inflate(R.layout.dialog_register, null))
        .setPositiveButton("E", new DialogInterface.OnClickListener() {
          @Override public void onClick(DialogInterface dialogInterface, int i) {
            Log.i("Stefano", "2");
          }
        })
        .setNegativeButton("w", new DialogInterface.OnClickListener() {
          @Override public void onClick(DialogInterface dialogInterface, int i) {
            Log.i("Stefano", "3");
          }
        })
        .create()
        .show();
  }

推荐阅读