Search code examples
javaandroidandroid-layoutandroid-fragmentsandroid-activity

Pressing back after getting fragment from backstack crashes app, "Android IllegalStateException Fragment already added"


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.


Solution

  • 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);