8

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

我们的 iOS 版本 (a UIAlertView) 使用

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

在其Show()方法中等待用户输入,然后返回他们的按钮选择作为结果。

我们可以在 Monodroid 中使用与此等效的 Android 吗?

4

3 回答 3

4

通过不同的设计解决:

我们不是等待用户与对话框交互并阻止其他所有内容,而是在我们的调用中提供对用户单击按钮时触发EventHandler的静态方法的调用:Show

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

EventHandler我们维护一个在按钮单击时触发的传入的私有引用,如下所示:

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

    _instance.Dismiss();
    _instance = null;
    _handler = null;
}

下面是一个Show来自 Activity 的调用的示例:

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

如果有人想了解有关在其 Xamarin Android 应用程序中使用静态对话框的更多信息,请告诉我!

于 2013-05-23T18:51:24.563 回答
3

我通过创建一个为我显示对话框的 AlertDialogHelper 类解决了这个问题。只是想与大家分享我的解决方案。

助手类

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");
于 2015-09-08T06:46:45.440 回答
1

你将不得不做两件事。首先覆盖后退按钮以防止用户退出活动。其次,您必须创建一个自定义对话框,该对话框会不断重新打开,直到用户执行正确的操作。这是因为用户无需使用对话框底部的按钮就可以触摸对话框外部来取消它。

这是上一篇关于创建自定义对话框的帖子的链接

示例是在 java 中。如果您需要翻译成 C# 的帮助,我可以举个例子。

这是您覆盖后退按钮的方法。

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

awaitConfirmation变量将是一个局部变量(默认为 false),在显示对话框之前将设置为 true,并在用户接受确认后设置回 false。

于 2013-05-22T17:05:22.480 回答