Fragment not destroyed on rotation
android, android-fragments
Solution
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)
Problem
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: - I am not setting setRetainInstance. - The fragment is not added in the activity onCreate (added later when a button is tapped) - I can see onDestroy is being called for the Activity upon rotation - Although the fragment is added, it obscures the add button and is only be dismissed when I do a "remove". 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.