Fragments behaviour: FragmentTransaction::replace() and reverse backStack operation
have you tried to use an other method, like remove(), then do an add(). or anything similar? I saw on some other post that the replace() method does not always behave correctly.
Axel M. Garcia
Updated on June 06, 2022Comments
-
Axel M. Garcia almost 2 years
I call this method to go forward from AFrag to BFrag:
showFragment() { FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction(); // Add fragment to the container ContentView fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag, mBFrag.getTag()); // Add FADE effect fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); // Keep the transaction in the back stack so it will be reversed when backbutton is pressed fragmentTransaction.addToBackStack(null); // Commit transaction fragmentTransaction.commit(); }
It shows a new fragment (BFrag), replace the previous one (AFrag) and keep info about the transaction, so it can be reversed/undone automatically on back button pressed.
When back button is pressed everything looks fine, the previous fragment is shown (AFrag). But when I go forward again (AFrag -> BFrag) I got a "Fragment already added exception".
Didn't the reverse/undone operation remove the new fragment (BFrag)? Is this the expected behaviour?
That's weird because after this, I decided to set a check:
if(mBFrag.isAdded()) { fragmentTransaction.show(mBFrag); } else { fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag, mBFrag.getTag()); }
and stills, it gets into the else statement... and I get the exception.
Any insight on what am I doing wrong, please?
Thx.
-
Axel M. Garcia almost 13 yearsYep, the answer and the other post you are talking about are mine buddy xD stackoverflow.com/questions/6250580/… Thx anyway
-
Eduardo Reis almost 7 yearsI am glad to hear this, I was just wondering the error was with my code, as always. Thank you for clarifying.