Fragment PopBackStack

49,604

Solution 1

You should not add your first fragment to the backstack, as pressing the return key will just reverse the action you did. So if you replace a fragment and you press back, it will reverse the replace you did. But if you press back on an '.add()' fragmenttransaction, it will simply remove it and show you a blank page. So i think removing the first fragment from the backstack should do the trick. Try it out and let me know!

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).commit();
    }

EXAMPLE:

So let's say you have two fragments called A & B

If you .add() fragment A to the page, and "addToBackStack()" ( = save reverse of the action ) you will have saved the REMOVE fragment A as action when you click on back.

If you .replace() fragment A by fragment B, and also "addToBackStack()" you will have saved the remove B and add A as action when you click on back.

So you see why it's not good practice to add your first fragmenttransaction to the backstack? It will just result in removing fragment A by pressing back, resulting in a blank page. Hope this is enough info.

Also, once you have removed the addToBackStack() to your first fragment, you don't need to override onBackPressed() because it will work how it is supposed to. It will just finish the activity when there is nothing left in the backstack without showing you that blank page first.

Solution 2

Your line:

if(fm.getBackStackEntryCount() > 1){

should be:

if (fm.getBackStackEntryCount() > 0) {

You are putting 3 fragments on the backstack. After you pop the first two entries off, the count of entries on the backstack then equals 1. So you prevent yourself from retrieving the first fragment you added to the backstack.

Solution 3

You are using this

manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

try to use this instead

manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

Let me know if it works for you.

Share:
49,604

Related videos on Youtube

Gaurav Arora
Author by

Gaurav Arora

I am a passionate Android Developer.

Updated on July 30, 2022

Comments

  • Gaurav Arora
    Gaurav Arora almost 2 years

    I am getting a strange problem, while using Fragments and popping back them out.

    I have one Fragment Activity:

    Step1: I am attaching one Fragment in the onCreate of that Activity in the Starting named Fragment A as:

    This is the onCreate of Fragment Activity

    @Override
        protected void onCreate(Bundle savedBundleState) {
            super.onCreate(savedBundleState);
            setContentView(R.layout.activity_base_new);
    
            Fragement_Home home = new Fragement_Home();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
        }
    

    Step:2 After that I attached replaced the Fragment with the following code:

    Fragment_More moreFragment = new Fragment_More();
                FragmentManager manager = getSupportFragmentManager();
                manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();
    

    Step 3: After that again I added one more Fragment on Fragment_More in the same way:

    Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();
    

    and here is my Fragment's Activity onBackPressedButton Lisetener:

    @Override
    public void onBackPressed() {
        FragmentManager fm = getSupportFragmentManager();
        Fragment f = fm.findFragmentById(R.id.frameContent);
    
     if(fm.getBackStackEntryCount() > 1){
             fm.popBackStack();
        } else{
            finish();
        }
    }
    

    Here is the Problem which I am getting:

    When I press back from Step 3, it gives me previous fragment successfully as described by onBackPressed, it will popbackstack and will take me to the previous Fragment. But from the Fragment_More, when I press back again, it shows me blank FRAGMENT content. It never shows the First Fragment which I had added on Step 1 in the OnCreate of the Activity.

    Please comment. What I am doing wrong ?

    Thanks

    • Admin
      Admin almost 10 years
      Can you provide us with fragment classes for the fragments you use?
    • C B J
      C B J almost 10 years
      I can't actually see anything wrong, in fact I've reproduced what you describe (as much as possible) and it works fine. I'm guessing there's something in the code you aren't showing.. I do note that you are changing a fragment in the activity from inside another fragment which can lead to trouble (you might want to think about using a listener from your activity).
    • Aditya Vyas-Lakhan
      Aditya Vyas-Lakhan over 8 years
  • Gaurav Arora
    Gaurav Arora almost 10 years
    No. It has not helped me
  • Chris
    Chris almost 10 years
    Could you try out my answer @GauravArora?