LoginSignup
4
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-29

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#的に書けばこんな感じなんだろうか・・・?
他にもないか探してみよう

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1