[英]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.