android - 对话框/AlertDialogs : How to "block execution" while dialog is up (. NET 样式)

标签 android

来自 .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/

相关文章:

android - SharedPreferences.getAll() 没有为假的首选项键。如何检索所有 key ?

Android Studio 在 xml 中重置我的@dimen

android - 如何获取用户选择的值

android - 如何从Android模拟器中删除谷歌帐户?

java - 在 Java 中,对 Class.class 的引用有什么作用?

android - 在 Android 中设置自定义 View 的属性

Android+Maven "No resource identifier found for attribute ' installLocation' in package 'android'”

javascript - 如何将图像添加到expo中的android可绘制资源而不运行expo prebuild来创建android文件夹

java - 如何在 android studio 中使用开关小部件使 function() 启用/禁用?

android - ActivityResultLauncher 结果代码始终返回 0 并取消结果