So I have an activity that holds a MapsFragment and first initializes it without storing it in backstack (if I store it in backstack, pressing back button pops off fragment and leaves empty container, which is not what I want). this is the code:
transaction.replace(mFragmentContainerRes,
MapsFragment.newInstance(), MapsFragment.getClass().getName()).commit();
I then replace it with a ChatRoomFragment like so:
transaction.replace(mFragmentContainerRes,
ChatRoomFragment .newInstance(), ChatRoomFragment .getClass().getName())
.addToBackStack(ChatRoomFragment .getClass().getName());
transaction.commit();
So then I have a Navigation Drawer in my main activity, and when the home button is pressed, I retrieve the MapsFragment like so from the backstack:
Fragment fragment = manager.findFragmentByTag(MapFragment.getClass().getName());
transaction.replace(mFragmentContainerRes, fragment, backStateName).commit();
Now if I press the back button while in the retrieved MapsFragment, the app crashes with this error thrown:
java.lang.IllegalStateException:
Fragment already added: MapsFragment{e34dc65 #0 id=0x7f0f00b4 com.MapsFragment}
at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1882)
at android.support.v4.app.BackStackRecord.executePopOps(BackStackRecord.java:825)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2577)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:851)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:794)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:174)
at com.main.MainActivity.onBackPressed(MainActivity.java:111)
For some reason, the Activity is trying to add the MapsFragment again when I press the back button. Why is this? How can I fix this?
According to my research, this usually happens if you .add instead of .replace, but I am calling .replace everywhere on my Fragment transactions.
Solved this issue by popping my entire backstack when wanting to return to the home fragment instead of replacing the current fragment with the home fragment:
getSupportFragmentManager().popBackStack(null,
FragmentManager.POP_BACK_STACK_INCLUSIVE);