かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Xamarin.AndroidでDialogFragmentを使う

時代はダイアログもフラグメント…ということでやってみました。簡単なアラートダイアログを出して、押したボタンに応じてトーストを表示してます。

using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;

namespace DialogFragmentApp
{
    [Activity(Label = "DialogFragmentApp", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            this.SetContentView(Resource.Layout.Main);
            var button = this.FindViewById<Button>(Resource.Id.MyButton);

            button.Click += (s, e) =>
            {
                // タグ名でフラグメントを取得してみる
                var dlg = this.FragmentManager
                    .FindFragmentByTag<MyDialogFragment>(typeof(MyDialogFragment).Name);
                if (dlg == null)
                {
                    // 取得できなかったらBundle軽油でメッセージを渡してダイアログを表示
                    Bundle b = new Bundle();
                    b.PutString("alertMessage", "Hello world");
                    dlg = new MyDialogFragment();
                    dlg.Arguments = b;
                    dlg.Show(this.FragmentManager, typeof(MyDialogFragment).Name);
                }
            };
        }
    }

    // ダイアログのフラグメント。
    // ボタンを押したときの処理に応答するためIDialogInterfaceOnClickListenerを実装
    class MyDialogFragment : DialogFragment, IDialogInterfaceOnClickListener
    {
        public override Dialog OnCreateDialog(Bundle savedInstanceState)
        {
            // ダイアログを作って返す
            var d = new AlertDialog.Builder(this.Activity)
                .SetTitle("title")
                .SetMessage(this.Arguments.GetString("alertMessage"))
                // OKボタンを押したときのコールバックの設定
                .SetPositiveButton("OK", this)
                // Cancelボタンを押したときのコールバックの設定
                .SetNegativeButton("Cancel", this)
                .Create();
            return d;
        }

        public void OnClick(IDialogInterface dialog, int which)
        {
            // トーストを作って表示
            Toast.MakeText(
                this.Activity,
                // whichがPositiveなときとそうじゃないときで表示テキストを切り替える
                which == (int)DialogButtonType.Positive ? "Positive" : "Negative",
                ToastLength.Long)
                .Show();
        }
    }

}

まぁコメント通りです。OnClick内でActivityに結果返すのどうするんだろう????