My solution to this problem is to re-create the fragment while keeping its state:
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.remove(old);
Fragment newInstance = recreateFragment(old);
ft.add(R.id.new_container, newInstance);
ft.commit();
With the following helper function:
private Fragment recreateFragment(Fragment f)
{
try {
Fragment.SavedState savedState = mFragmentManager.saveFragmentInstanceState(f);
Fragment newInstance = f.getClass().newInstance();
newInstance.setInitialSavedState(savedState);
return newInstance;
}
catch (Exception e) // InstantiationException, IllegalAccessException
{
throw new RuntimeException("Cannot reinstantiate fragment " + f.getClass().getName(), e);
}
}
It works for me, at least with the latest support library (r11), although I didn’t test much yet.
The extra cost is to instantiate the fragment twice.