かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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に結果返すのどうするんだろう????