android – Fragment PopBackStack-ThrowExceptions

Exception or error:

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

How to solve:

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.

###

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.

###

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.

Leave a Reply

Your email address will not be published. Required fields are marked *