用于android mono的消息框

时间:2012-05-22 06:23:51

标签: android mono monodevelop xamarin.android alertdialog

在函数完成AlertDialog.Builder之前来自用户的响应,例如messagebox,但我想等到用户回答。我该怎么办?

            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; 
            }

3 个答案:

答案 0 :(得分: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);
});

我有一个blog post up here,它还讨论了在后台线程中工作的不同方法,并在UI中显示结果,如果这适用于您的情况。希望这有助于清理事情!

答案 1 :(得分: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);
        }
    }
}

答案 2 :(得分:1)

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

您无法阻止代码并等待答案 - 您必须回复答案事件。