首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >来自AlertDialog的c# Xamarin安卓返回响应bool

来自AlertDialog的c# Xamarin安卓返回响应bool
EN

Stack Overflow用户
提问于 2018-06-19 20:50:47
回答 1查看 1K关注 0票数 0

如果用户从AlertDialog中选择yes,我会尝试返回一个布尔值true,反之亦然。

目前,它总是返回false。看起来布尔值“结果”永远不会被设定。

代码语言:javascript
复制
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;
}

然后我调用这个方法

代码语言:javascript
复制
this.RunOnUiThread(() =>
{

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

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

});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 05:37:15

您可以通过ManualResetEventTaskCompletionSource创建一个Task-based对话框,因此您可以这样调用它:

通过TaskCompletionSource使用示例:

代码语言:javascript
复制
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示例:

代码语言:javascript
复制
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使用示例:

代码语言:javascript
复制
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示例:

代码语言:javascript
复制
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;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50928924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档