Xamarin Android:保持警报对话框的控制,直到点击一个button

我们正在使用一个静态的警报对话框来获得用户对某些操作的确认。 在我们对Show()调用中,我们希望保持控制,直到用户单击一个button,以便我们可以在Show()调用结束时返回button单击结果。

我们的iOS版本( UIAlertView )使用

 while (displayed) { MonoTouch.Foundation.NSRunLoop.Current.RunUntil( MonoTouch.Foundation.NSDate.FromTimeIntervalSinceNow(0.2)); } 

在其Show()方法中,在返回buttonselect之前等待用户input。

有没有一个相当于我们可以在Monodroid中使用的Android?

Solutions Collecting From Web of "Xamarin Android:保持警报对话框的控制,直到点击一个button"

通过不同的devise解决:

与其等待用户与对话进行交互并阻止其他所有内容,我们在调用静态Show方法时提供了一个EventHandler ,当用户单击button时将触发该方法:

 public static void Show(string title, string message, Context context, EventHandler handler, ConfirmationAlertButton button) { ... } 

我们在EventHandler中维护一个私有的引用,通过点击button触发,如下所示:

 private static void OkClicked(object sender, DialogClickEventArgs e) { if (_handler != null) { _handler.Invoke(sender, e); } _instance.Dismiss(); _instance = null; _handler = null; } 

下面是一个示例, Show了一个来自Activity的Show

 ConfirmationDialog.Show(@"Message title", @"Message text", this, delegate { if (e.Result) { Finish(); } else { Invalidate(); } }, ConfirmationAlertButton.OK); 

如果有人想要在他们的Xamarin Android应用程序中使用静态对话框的更多信息,请让我知道!

我已经通过创build一个AlertDialogHelper类来解决这个问题,该类为我显示了对话框。 只是想与你们分享我的解决scheme。

助手类

 public class AlertDialogHelper : Java.Lang.Object, IDialogInterfaceOnDismissListener { Context context; ManualResetEvent waitHandle; string title; string message; string positiveButtonCaption; string negativeButtonCaption; bool dialogResult; public static async Task<bool> ShowAsync(Context context, string title, string message) { return await AlertDialogHelper.ShowAsync(context, title, message, "OK", "Cancel"); } public static async Task<bool> ShowAsync(Context context, string title, string message, string positiveButton, string negativeButton) { return await new AlertDialogHelper(context, title, message, positiveButton, negativeButton).ShowAsync(); } private AlertDialogHelper(Context context, string title, string message, string positiveButton, string negativeButton) { this.context = context; this.title = title; this.message = message; this.positiveButtonCaption = positiveButton; this.negativeButtonCaption = negativeButton; } private async Task<bool> ShowAsync() { this.waitHandle = new ManualResetEvent(false); new AlertDialog.Builder(this.context) .SetTitle(this.title) .SetMessage(this.message) .SetPositiveButton(this.positiveButtonCaption, OnPositiveClick) .SetNegativeButton(this.negativeButtonCaption, OnNegativeClick) .SetOnDismissListener(this) .Show(); Task<bool> dialogTask = new Task<bool>(() => { this.waitHandle.WaitOne(); return this.dialogResult; }); dialogTask.Start(); return await dialogTask; } private void OnPositiveClick(object sender, DialogClickEventArgs e) { this.dialogResult = true; this.waitHandle.Set(); } private void OnNegativeClick(object sender, DialogClickEventArgs e) { this.dialogResult = false; this.waitHandle.Set(); } public void OnDismiss(IDialogInterface dialog) { this.dialogResult = false; this.waitHandle.Set(); } } 

用法

 // Default buttons bool dialogResult = await AlertDialogHelper.ShowAsync(this, "Dialog title", "Some informative message."); // Custom buttons bool dialogResult = await AlertDialogHelper.ShowAsync(this, "Dialog title", "Some informative message.", "Yes", "No"); 

你将不得不做2件事。 首先覆盖后退button,以防止用户退出活动。 其次,您将不得不创build一个自定义对话框,保持重新打开,直到用户执行正确的操作。 这是因为用户可以在对话框外面触摸来取消它,而不使用对话框底部的button。

以下是创build自定义对话框的前一篇文章的链接

该示例是在Java中。 如果您需要帮助转换为C#我可以给你一个例子。

这里是你如何覆盖后退button。

 public override bool OnKeyDown(Keycode keyCode, KeyEvent e) { if (keyCode == Keycode.Back && awaitConfirmation) return true; else return base.OnKeyDown(keyCode, e); } 

awaitConfirmationvariables是一个局部variables(默认为false),在显示对话框之前设置为true,当用户接受确认时设置为false。