来自 .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
那样“停止执行”,然后在按下按钮时返回一个值(对话框消失)?
编辑 1
为了更清楚一点:
我需要暂停执行并等待用户选择一个按钮以在弹出窗口中单击。调用之后显示 Dialog 的代码取决于在 Dialog 中单击的按钮。
这就是为什么我不能使用 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
如果我希望执行依赖于弹出窗口中的选择,我必须以某种方式使“正常执行”中的所有变量(在本例中为 nextStep
)在 onClick 中可用-方法,这对我来说听起来就像 hell 。
编辑 2
另一个明显的例子是一个弹出窗口询问“你想继续吗”,选项有"is"和“否”。
如果用户按下"is",整个方法应该被中止,否则它应该继续执行。你如何很好地解决这个问题?
最佳答案
Ted,你不想这样做,真的 :) 最大的原因是,如果你在显示 Dialog 时阻塞了 UI 线程,你将阻塞负责绘制和处理事件的线程你的对话框。这意味着您的对话框将无响应。如果用户点击对话框的时间超过几秒钟,您也会导致 ANR。
Erich 的答案正是您所需要的。我知道这不是您想要的,但这没关系。我们将 Android 设计为防止开发人员编写同步对话框,因此您实际上别无选择。
关于android - 对话框/AlertDialogs : How to "block execution" while dialog is up (. NET 样式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2028697/