I have a fragment which is added programmatically. I have however discovered that after a rotation, a new fragment is created but the old fragment is still alive (though not being displayed) I assumed that fragments are destroyed along with the activity on rotation, but this is not the case here. What could be causing my fragment to be retained / not destroyed? Please note:
Code creating the fragment:
MyFragment fragment = MyFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.content_frame, fragment, "CurrentFragment");
fragmentTransaction.show(fragment).commit();
Code removing the fragment:
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(fragment).commit();
UPDATE: I cannot confirm if this was the problem, but the fragment registers as a LocalBroadcast receiver in onCreate. It unregistered for broadcasts in onDestroy, but it seems that either the LocalBroadcast registration was preventing onDestroy being called, or onDestroy was not called upon rotation. I now unregister in onStop and this seems to have solved the issue.
When the Activity is restarted because of a orientation change, the Android Framework recreates and adds the Fragment automatically for you.
You probably add the Fragment in onCreate
of your Activity
. That's where you add an additional Fragment after the orientation change.
You have to check if the Fragment is already added:
Fragment f = getFragmentManager().findFragmentById(R.id.content_frame);
if(f == null){
//Add it, there is no Fragment
}else{
//It's already there
}
Every time you tapp the button that adds the Fragment, a new Fragment will be added. If your container is a FrameLayout you probably won't see it. Try to replace the Fragments:
fragmentTransaction.replace(R.id.content_frame, fragment, "CurrentFragment");
The method setRetainInstance(true)
has another purpose. If you enable it, the Fragment
instance will not be destroyed when the orientation changes (but its Views will be destroyed). That means you can store data in the member variables of a Fragment
and this data will still be available after an orientation change.
When setting setRetainInstance(true)
the life-cycle of the Fragment is slightly different. I.e. onCreate()
and onDestroy()
are not called (Because those event do not happen)
Why Cant you replace the existing fragment with new fragment which you want to load.
try this may help you.
FragmentNew mFragmentNew = new FragmentNew ();// Which you want to load That Fragment Object
getFragmentManager().beginTransaction()
.replace(R.id.item_detail_container, mFragmentNew)
.commit();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With