android - 警报对话框的开始
问题描述
是否有可能(并且正确)开始AlertDialog
?我的意思是AlertDialog
where 。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();
解决方案
是否有可能(并且正确)启动 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();
}
推荐阅读
- android - 如何使用 GSON 实现 json?得到一个错误
- python - 新对象不会追加到列表
- node.js - 来自 Heroku 托管的 Express 的“应用程序崩溃”和 503 错误响应
- python - Masonite - TypeError > 使用 Auth 登录方法时没有字符串参数的编码
- image-processing - 图像为 JPEG,但 Torchvision 显示图像扩展名不受支持
- ethereum - 如何从 Metamask 获取账户地址?
- java - 如何停止在android中循环声音?
- c# - 如何从 SQL Server 数据库表列中获取男性或女性并在转发器控件中显示记录?
- php - 如何从 imap_open() 函数输出 json 数据?
- php - PHP 通过引用传递错误?