Можно ли (и правильно) создать 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();
}