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