Xamarin.Android FragmentからActivityへのCallback処理的なやつ

Android Javaで Fragment上にあるボタンのイベント終了後、(ログイ画面とか)別の画面に遷移させる時

```Fragment.java

    public interface Callback {
        void onLoginFinish(LoginFragmentMain self);
    }

```

見たいなのを用意して

```Activity.java
    @Override
    public void onLoginFinish(LoginFragmentMain self) {
        startActivity(new Intent(HogeMapActivity.buildActivity(this)));
        finish();
    }
```
Activity側でオーバーライドしてFragmentの処理の後に遷移させるのを今回Xamarinでやろうとして
少しばかり詰まったので忘れないように残しておく。



C#でやる場合

Fragment側

```Fragment.cs
namespace jp.co.xxxxxx.xxxxxx.xxxxxx.Droid
{
    public class LoginFragmentMain : Fragment
    {
        Button LoginButton;

        EditText LoginId;
        EditText Password;

        Login Login = FirebaseDataBase.GetLoginInstance();

        public event EventHandler LoginButtonWasClicked;
        
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here
        }
        
        public override View OnCreateView(LayoutInflater inflater, ViewGroup 
               container, Bundle savedInstanceState)
        {
           View view = inflater.Inflate(Resource.Layout.system_login_fragment_main, container, false);
            LoginId = view.FindViewById<EditText>(Resource.Id.id_input_edit_text);
            Password = view.FindViewById<EditText>(Resource.Id.pw_input_edit_text);
            LoginButton = view.FindViewById<Button>(Resource.Id.login_button);
            LoginButton.Click += async(sender, e) => {
                
                System.Diagnostics.Debug.WriteLine("Fragment Event");

                var result = await Login.StartLogin(LoginId.Text, Password.Text);
                switch (result.errCode)
                {
                    case (int)Define.LoginError.ERR_NONE:
                        break;

                    case (int)Define.LoginError.ERR_NOT_ID:
                        break;

                    case (int)Define.LoginError.ERR_NOT_PW:
                        break;

                    case (int)Define.LoginError.ERR_CRITICAL:
                        break;

                    case (int)Define.LoginError.ERR_NOTEQ_PASSWORD:
                        break;
                }
                
                LoginButtonWasClicked(this, e);
            };
            return view;
        }
    }
}

```

Activity側

```LoginActivity.cs
namespace jp.co.xxxxxx.xxxxxx.xxxxxx.Droid
{
    [Activity(Label = "Hogeアプリ", MainLauncher = true, Icon = "@mipmap/icon")]
    public class LoginActivity : Activity
    {
        int count = 1;
        LoginFragmentMain login = new LoginFragmentMain();
        public delegate void LoginDelegate();
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.system_login_activity);

            this.FragmentManager.BeginTransaction()
                .Replace(Resource.Id.Content_Holder_Root, login, typeof(LoginFragmentMain).Name)
                .AddToBackStack(null)
                .Commit();

            login.LoginButtonWasClicked += OnLoginButtonClick;

            // Get our button from the layout resource,
            // and attach an event to it
            //Button button = FindViewById<Button>(Resource.Id);
            //button.Click += delegate { button.Text = $"{count++} clicks!"; };
        }

        public void OnLoginButtonClick(object sender , object obj)
        {
            System.Diagnostics.Debug.WriteLine("OnclickLoginButton");
            var intent = new Intent(this, typeof(HogeMapActivity));
            StartActivity(intent);
        }
    }
}

```

シンプルにActivity側でイベント用のメソッドを置いといて、FragmentにEventHandlerを定義し、
ActivityでFragmentのEventHandlerに対しイベントメソッドを入れてあげれば、
Fragment上に置いてあるボタンをタップしてActivityで遷移処理をさせることができた。

C#的に書けばこんな感じなんだろうか・・・？
他にもないか探してみよう