5

在函数完成之前用户的响应 AlertDialog.Builder 就像消息框一样,但我想等到用户回答。我该怎么办?

            public bool test() 
            { 
                    bool tst=false; 

                    AlertDialog.Builder builder = new AlertDialog.Builder (this); 
                    builder.SetTitle (Android.Resource.String.DialogAlertTitle); 
                    builder.SetIcon (Android.Resource.Drawable.IcDialogAlert); 
                    builder.SetMessage ("message"); 
                    builder.SetPositiveButton ("OK",(sender,e)=>{ 
                            tst=true; 
                    }); 
                    builder.SetNegativeButton ("NO",(sender,e)=>{ 
                            tst=false; 
                    }); 

                    builder.Show(); 

                    return tst; 
            }
4

3 回答 3

11

斯图尔特在这里的回答是正确的,但我只是想对其进行一些扩展,因为似乎仍然存在一些混淆,这是设计应用程序的重要概念。

当您在 UI 中处理事情时,例如响应用户输入或提示信息,您永远不想阻塞 UI。因此,在这种情况下,您需要以允许异步执行的方式设计代码。正如您所注意到的,在您的代码示例中,函数会立即返回,因为它不会等待回调被执行。如果它确实等待,UI 线程将被阻塞并且您的应用程序将被冻结,这几乎肯定不是您想要的。

由于我没有此函数调用的任何上下文,因此我将组成一个简单的示例。假设您想获取函数的返回值并将其写入日志。使用您提供的同步方法,看起来像这样:

bool returnValue = test();

Console.WriteLine(returnValue);

相反,我建议做的是重组test()方法,使其行为异步。我会重写它看起来像这样:

public void test(Action<bool> callback)
{
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.SetTitle(Android.Resource.String.DialogAlertTitle);
    builder.SetIcon(Android.Resource.Drawable.IcDialogAlert);
    builder.SetMessage("message");
    builder.SetPositiveButton("OK", (sender, e) =>
                                    {
                                        callback(true);
                                    });
    builder.SetNegativeButton("NO", (sender, e) =>
                                    {
                                        callback(false);
                                    });

    builder.Show();
}

这个版本和你的很相似,只是不是直接从方法调用返回值,而是通过方法的回调参数发回。然后可以将写入日志的代码更新为:

test(returnValue =>
{
    Console.WriteLine(returnValue);
});

我在这里有一篇博文,还讨论了在后台线程中工作并在 UI 中显示结果的不同方法,如果这适用于您的情况的话。希望这有助于澄清事情!

于 2012-05-22T14:14:35.057 回答
5

我知道这是旧的,但我已经根据我在这里和那里找到的答案开发了一个简单的助手,所以我在这里希望它可以帮助某人。享受..

using System;
using Android.App;
using Android.Content;

namespace MyApp.Helpers
{
    #region Enums
    public enum MessageBoxResult
    {
        None = 0,
        OK,
        Cancel,
        Yes,
        No
    }

    public enum MessageBoxButton
    {
        OK = 0,
        OKCancel,
        YesNo,
        YesNoCancel
    }

    public enum MessageBoxButtonText
    {
        Ok, 
        Cancel, 
        Yes, 
        No
    }

    #endregion

    public static class MessageBoxHelper
    {
        public static void Show(Context context, Action<bool> callback, string messageBoxText, string caption, MessageBoxButton buttonType)
        {
            AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
            alertBuilder.SetTitle(caption);
            //builder.SetIcon(Android.Resource.Drawable.IcDialogAlert);
            alertBuilder.SetMessage(messageBoxText);

            switch (buttonType)
            {
                case MessageBoxButton.OK:
                    alertBuilder.SetPositiveButton(MessageBoxButtonText.Ok.ToString(), (sender, e) => callback(true));
                    break;

                case MessageBoxButton.OKCancel:
                    alertBuilder.SetPositiveButton(MessageBoxButtonText.Ok.ToString(), (sender, e) => callback(true));
                    alertBuilder.SetNegativeButton(MessageBoxButtonText.Cancel.ToString(), (sender, e) => callback(false));
                    break;

                case MessageBoxButton.YesNo:
                    alertBuilder.SetPositiveButton(MessageBoxButtonText.Yes.ToString(), (sender, e) => callback(true));
                    alertBuilder.SetNegativeButton(MessageBoxButtonText.No.ToString(), (sender, e) => callback(false));
                    break;
            }
            alertBuilder.Show();
        }

        public static void Show(Context context, string messageBoxText)
        {
             Show(context, delegate(bool b) { }, messageBoxText, "", MessageBoxButton.OK);
        }

        public static void Show(Context context, string messageBoxText, string caption)
        {
            Show(context, delegate(bool b) { }, messageBoxText, caption, MessageBoxButton.OK);
        }
    }
}
于 2013-01-29T23:15:38.410 回答
1

https://github.com/xamarin/monodroid-samples/blob/master/ApiDemo/App/AlertDialogSamples.cs中有来自 Xamarin的完整示例

您不能阻止代码并等待答案 - 您必须改为响应 answer 事件。

于 2012-05-22T06:27:34.700 回答