Начало AlertDialog - PullRequest
       5

Начало AlertDialog

0 голосов
/ 06 мая 2018

Можно ли (и правильно) создать AlertDialog? Я имею в виду AlertDialog где. 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();

1 Ответ

0 голосов
/ 11 мая 2018

Можно ли (и правильно) создать AlertDialog?

Да, это возможно.

Если да, могут ли два AlertDialog иметь одинаковые имена?

У вас может быть два AlertDialog с одинаковым именем переменной, аналогично использованию двух переменных с одинаковым именем. Это называется Shadowing :

Если объявление типа (например, переменная-член или параметр имя) в определенной области (например, внутренний класс или метод определение) имеет то же имя, что и другая декларация во вложении область действия, то объявление затеняет объявление вмещающей объем. Вы не можете ссылаться на скрытую декларацию только по ее названию.

В вашем случае вы создаете еще один диалог внутри анонимного класса, который является DialogInterface.OnClickListener. Затенение все еще применяется. Документация Anonymous Classes описывает это:

Как и локальные классы, анонимные классы могут захватывать переменные; у них есть тот же доступ к локальным переменным в пределах объема:

Анонимный класс имеет доступ к членам своего включающего класса.

Анонимный класс не может получить доступ к локальным переменным во вложении область действия, которая не объявлена ​​как окончательная или фактически окончательная.

Как и вложенный класс, объявление типа (такого как переменная) в анонимный класс скрывает любые другие объявления во вложении объем, которые имеют то же имя. См. Shadowing для получения дополнительной информации.

Итак, вы можете изменить свой код на что-то вроде этого:

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