C#Xamarin Android从AlertDialog返回响应布尔 [英] c# Xamarin Android return response bool from AlertDialog

查看:182
本文介绍了C#Xamarin Android从AlertDialog返回响应布尔的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果用户从AlertDialog中选择是,反之亦然,我试图返回布尔值true.

I am trying to return a bool true if the user selects yes from AlertDialog and visa versa.

此刻,它始终返回false.似乎没有设置布尔值结果".

at the moment it always returns false. it seems like the bool "result" is never being set.

public bool AskForConfirmation(string messege, Context context)
{
    bool result;

    Android.Support.V7.App.AlertDialog.Builder dialog = new Android.Support.V7.App.AlertDialog.Builder(context);

    dialog.SetPositiveButton("Yes", (sender, args) =>
    {
        result = true;
    });

    dialog.SetNegativeButton("No", (sender, args) =>
    {
        result = false;
    }).SetMessage(messege).SetTitle("System Message");


    dialog.Show();

    return result;
}

然后我调用该方法

this.RunOnUiThread(() =>
{

    bool response = ioManager.AskForConfirmation("Message", this);

    Console.WriteLine("Response is " + response);

});

推荐答案

您可以通过 ManualResetEvent TaskCompletionSource 创建基于 Task 的对话框.代码>,因此您可以这样称呼它:

You can create a Task-based dialog via a ManualResetEvent or a TaskCompletionSource so you can call it like this:

try
{
    var result = await DialogAsync.Show(this, "StackOverflow", "Does it rock?");
    Log.Debug("SO", $"Dialog result: {result}");
}
catch (TaskCanceledException ex)
{
    Log.Debug("SO", $"Dialog cancelled; backbutton, click outside dialog, system-initiated, .... ");
}

通过TaskCompletionSource示例的DialogAsync:

public class DialogAsync : Java.Lang.Object, IDialogInterfaceOnClickListener, IDialogInterfaceOnCancelListener
{
    readonly TaskCompletionSource<bool?> taskCompletionSource = new TaskCompletionSource<bool?>();

    public DialogAsync(IntPtr handle, Android.Runtime.JniHandleOwnership transfer) : base(handle, transfer) { }
    public DialogAsync() { }

    public void OnClick(IDialogInterface dialog, int which)
    {
        switch (which)
        {
            case -1:
                SetResult(true);
                break;
            default:
                SetResult(false);
                break;
        }
    }

    public void OnCancel(IDialogInterface dialog)
    {
        taskCompletionSource.SetCanceled();
    }

    void SetResult(bool? selection)
    {
        taskCompletionSource.SetResult(selection);
    }

    public async static Task<bool?> Show(Activity context, string title, string message)
    {
        using (var listener = new DialogAsync())
        using (var dialog = new AlertDialog.Builder(context)
                                                            .SetPositiveButton("Yes", listener)
                                                            .SetNegativeButton("No", listener)
                                                            .SetOnCancelListener(listener)
                                                            .SetTitle(title)
                                                            .SetMessage(message))
        {
            dialog.Show();
            return await listener.taskCompletionSource.Task;
        }
    }
}

通过ManualResetEvent示例进行使用:

using (var cancellationTokenSource = new CancellationTokenSource())
{
    var result = await DialogAsync.Show(this, "StackOverflow", "Does it rock?", cancellationTokenSource);
    if (!cancellationTokenSource.Token.IsCancellationRequested)
    {
        Log.Debug("SO", $"Dialog result: {result}");
    }
    else
    {
        Log.Debug("SO", $"Dialog cancelled; backbutton, click outside dialog, system-initiated, .... ");
    }
}

通过ManualResetEvent示例进行的DialogAsync:

public class DialogAsync : Java.Lang.Object, IDialogInterfaceOnClickListener, IDialogInterfaceOnCancelListener
{
    readonly ManualResetEvent resetEvent = new ManualResetEvent(false);
    CancellationTokenSource cancellationTokenSource;
    bool? result;

    public DialogAsync(IntPtr handle, Android.Runtime.JniHandleOwnership transfer) : base(handle, transfer) { }
    public DialogAsync() { }

    public void OnClick(IDialogInterface dialog, int which)
    {
        switch (which)
        {
            case -1:
                SetResult(true);
                break;
            default:
                SetResult(false);
                break;
        }
    }

    public void OnCancel(IDialogInterface dialog)
    {
        cancellationTokenSource.Cancel();
        SetResult(null);
    }

    void SetResult(bool? selection)
    {
        result = selection;
        resetEvent.Set();
    }

    public async static Task<bool?> Show(Activity context, string title, string message, CancellationTokenSource source)
    {
        using (var listener = new DialogAsync())
        using (var dialog = new AlertDialog.Builder(context)
                                                            .SetPositiveButton("Yes", listener)
                                                            .SetNegativeButton("No", listener)
                                                            .SetOnCancelListener(listener)
                                                            .SetTitle(title)
                                                            .SetMessage(message))
        {
            listener.cancellationTokenSource = source;
            context.RunOnUiThread(() => { dialog.Show(); });
            await Task.Run(() => { listener.resetEvent.WaitOne(); }, source.Token);
            return listener.result;
        }
    }
}

这篇关于C#Xamarin Android从AlertDialog返回响应布尔的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆