在函数完成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;
}
答案 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中的完整样本
您无法阻止代码并等待答案 - 您必须回复答案事件。