来自.NET环境我现在正在研究如何使用Dialogs在Android中工作。
在.NET中,调用MessageBox.Show(...)时会创建并显示一个弹出对话框。在对Show的调用中,我可以指定在弹出窗口中应该可用的按钮,例如:
DialogResult myDialogResult = MessageBox.Show("My text here", "My caption here", MessageBoxButtons.YesNoCancel);
正如你所看到的,Show中的调用返回一个DialogResult,当在弹出窗口中按下一个按钮时,通知我点击了哪个按钮。请注意,在.NET中,在Show(...)调用所在的行停止执行,因此当按下按钮时它可以返回值。
如果我在上面的例子中按“否”,myDialogResult将等于
myDialogResult == DialogResult.No
因为我发现使用/创建弹出窗口的.NET方式非常简单直观,所以我希望能够在Android中创建弹出窗口。
所以,问题是如果有人知道如何像MessageBox.Show一样“停止执行”,然后每当Button被按下(并且对话框消失)时返回一个值?
我需要暂停执行,并等待用户选择了一个按钮来单击弹出窗口。调用后显示对话框的代码取决于在对话框中单击了哪个按钮。
这就是为什么我不能使用Erich和Alex的建议,因为在onClick方法中编写代码如下所示是行不通的。原因是我无法继续“正常执行”。让我举个例子:
让我举个例子:
int nextStep = 0; // this variable will not be reached from within the onClick-methods
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Hello!")
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
nextStep = 1; // *** COMPILER ERROR!! ***
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
nextStep = 2; // *** COMPILER ERROR!! ***
}
})
.create().show();
if (nextStep == 1)
{
// then do some damage
}
else if (nextStep == 2
// dont do damage
如果我希望执行依赖于弹出窗口中的选择,我将不得不使用onClick方法在“正常执行”(在这种情况下为nextStep)中创建所有变量,这对我来说听起来像是地狱般的。
另一个明显的例子是一个弹出窗口,询问“是否要继续”选项“是”和“否”。
如果用户按下“是”,则应该中止整个方法,否则应该继续执行。你如何很好地解决这个问题?
发布于 2018-03-19 09:00:17
最大的原因是,如果你在显示对话框的时候阻塞了UI线程,你将会阻塞负责绘制和处理对话框事件的线程。这意味着您的对话框将无响应。如果用户需要几秒钟才能点击对话框,您还将导致ANR。
我们设计了Android来防止开发人员编写同步对话框,因此你没有太多选择余地。
发布于 2018-03-19 09:12:40
在Android中,这种结构不同于.NET:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Hello!")
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Handle Ok
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Handle Cancel
}
})
.create();
会给你一个带有两个按钮的对话框,并用回调处理按钮点击。可能可以编写一些代码来使语法更接近.NET,但对话框的生命周期相互交织在一起Activity
,所以最终它可能比它的价值更麻烦。其他对话框引用在这里。
https://stackoverflow.com/questions/-100007660
复制相似问题