I have an Activity
with three Fragments lets call them A, B and C. Fragment
A is called in the Activity onCreate()
.
FragmentA fragA = new FragmentA();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.activity2_layout, fragA, "A");
transaction.commit();
And gets replaced with Fragment B or C when certain buttons are pressed, and the FragmentTransaction calls addToBackStack()
.
FragmentB fragB = new FragmentB(); //or C
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.activity2_layout, fragB, "B"); //or C
transaction.addToBackStack("B"); //or C
transaction.commit();
But lets say I call Fragment
B three times in a row, how can I prevent it from stacking on to it self? And at the same time I want this to be possible: B called > C called > B called - BUT when i try to go back I want B to be opened only once ( C < B) instead of (B < C < B). So basically removing the first backStack with the new one.
I have solved one of your questions, namely
how can I prevent it from stacking on to it self?
, in one of my own projects a while ago. This was the exact code I used there:What this code does is checks of what class the currently showing Fragment is and compare that to the fragment you want to replace it with. If they are the same, it doesn't do anything. This code can be shaped to fit your needs like so
Making sure that only one fragment of a certain type is present at a time could probably be achieved by popping the backstack until before the first occurence of the same fragment. I have not written any code for this but it shouldn't be too difficult to implement that feature. If you can't figure it out yourself, let me know and I will try to write you an example :)
From How to resume Fragment from BackStack if exists, which maybe very similar to your query.
There is a way to pop the back stack based on either the transaction name or the id provided by commit (for eg. using the Fragment's class name as Thijs already mentioned):
Adding to backstack:
When popping:
So before replacing fragment, we can check existance in backstack like:
Please check the above question and the accepted answer for more explanation.