簡體   English   中英

用於android mono的消息框

[英]messagebox for android mono

在函數完成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; 
            }

斯圖爾特在這里的回答是正確的,但我只是想稍微擴展它,因為似乎仍有一些混亂,這是設計應用程序的一個重要概念。

當您處理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中顯示結果,如果這適用於您的情況。 希望這有助於清理事情!

我知道這已經過時了,但我根據我在這里和那里找到的答案開發了一個簡單的幫助器,所以我希望它能幫到某個人。 請享用..

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

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

您無法阻止代碼並等待答案 - 您必須回復答案事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM