5

関数が完了する前にユーザーからの応答が AlertDialog.Builder のようにメッセージ ボックスに表示されますが、ユーザーが応答するまで待ちたいと思います。私はどのように行いますか?

            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; 
            }
4

3 に答える 3

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);
});

バックグラウンド スレッドで作業を行い、結果を UI に表示するさまざまな方法についても説明しているブログ記事をここに掲載しています。これが問題を解決するのに役立つことを願っています!

于 2012-05-22T14:14:35.057 に答える
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);
        }
    }
}
于 2013-01-29T23:15:38.410 に答える
1

Xamarinのhttps://github.com/xamarin/monodroid-samples/blob/master/ApiDemo/App/AlertDialogSamples.csに完全なサンプルがあります。

コードをブロックして回答を待つことはできません。代わりに回答イベントに応答する必要があります。

于 2012-05-22T06:27:34.700 に答える