If you have some
Fragment
SetRetainInstance
Fragment
OnCreate
Activity
setRetainInstance
protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
var f = new SomeFragment();
var ft = FragmentManager.BeginTransaction();
ft.Replace(Android.Resource.Id.Content, f);
ft.Commit();
}
OnCreate
SomeFragment
SomeFragment f;
protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
if(f == null) {
f = new SomeFragment(this);
f.RetainInstance = true;
}
var ft = FragmentManager.BeginTransaction();
ft.Replace(Android.Resource.Id.Content, f);
ft.Commit();
}
f
f
static SomeFragment f;
RetainInstance
setRetainInstance
RetainInstance
RetainInstance
RetainInstance
Although I am not familiar to Xamarin, I can answer this in Java.
Instead of using
replace(int containerViewId, Fragment fragment)
You should use
replace(int containerViewId, Fragment fragment, String tag)
For example,
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment;
fragment = (ExampleFragment) fragmentManager.findFragmentByTag("tag");
if(fragment == null)
fragment = new ExampleFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment, "tag");
fragmentTransaction.commit();
But you should only use setRetainInstance
if you are running longe task at background. You may have a look at this blog post. Recreating the fragment is more suggested as it can avoid unexpected behavior (e.g. not initializing some variables).