how to go back to previous fragment on pressing manually back button of individual fragment? how to go back to previous fragment on pressing manually back button of individual fragment? android android

how to go back to previous fragment on pressing manually back button of individual fragment?


public void onBackPressed(){    FragmentManager fm = getActivity().getSupportFragmentManager();    fm.popBackStack();}


I have implemented the similar Scenario just now.

Activity 'A' -> Calls a Fragment 'A1' and clicking on the menu item, it calls the Fragment 'A2' and if the user presses back button from 'A2', this goes back to 'A1' and if the user presses back from 'A1' after that, it finishes the Activity 'A' and goes back.

See the Following Code:

Activity 'A' - OnCreate() Method:

@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activityA);    if (savedInstanceState == null) {        Fragment fragInstance;        //Calling the Fragment newInstance Static method        fragInstance = FragmentA1.newInstance();        getFragmentManager().beginTransaction()                .add(R.id.container, fragInstance)                .commit();    }}

Fragment : 'A1'

I am replacing the existing fragment with the new Fragment when the menu item click action happens:

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {    if (item.getItemId() == R.id.action_edit_columns) {        //Open the Fragment A2 and add this to backstack        Fragment fragment = FragmentA2.newInstance();        this.getFragmentManager().beginTransaction()                .replace(R.id.container, fragment)                .addToBackStack(null)                .commit();        return true;    }    return super.onOptionsItemSelected(item);}

Activity 'A' - onBackPressed() Method:

Since all the fragments have one parent Activity (which is 'A'), the onBackPressed() method lets you to pop fragments if any are there or just return to previous Activity.

@Overridepublic void onBackPressed() {    if(getFragmentManager().getBackStackEntryCount() == 0) {        super.onBackPressed();    }    else {        getFragmentManager().popBackStack();    }}

If you are looking for Embedding Fragments inside Fragments, please refer the link: http://developer.android.com/about/versions/android-4.2.html#NestedFragments


@trueblue's answer got me going with one minor but annoying issue. When there is only one fragment on the backstack and you press back button, that frame is removed and the app remains active with a blank screen. User needed to press back button one more time to exit the app. I modified the original code to the following in order to handle this situation

@Overridepublic void onBackPressed() {    if(getFragmentManager().getBackStackEntryCount() == 0) {        super.onBackPressed();    }    else if(getFragmentManager().getBackStackEntryCount() == 1) {        moveTaskToBack(false);    }    else {        getFragmentManager().popBackStack();    }}

When there is only 1 fragment in the backstack, we are basically telling android to move the whole app to back.

Update (and probably a better answer)

So after doing some more reading around this, I found out that you can add fragment manager transactions to back stack and then android handles back presses automatically and in a desired way. The below code snippet shows how to do that

Fragment fragment; //Create and instance of your fragment class hereFragmentManager fragmentManager = getFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null);fragmentTransaction.commit();fragmentTransaction.addToBackStack(null);

The last line shows how you add a transaction to back stack. This solves back press issue for fragments in most situations except for one. If you go on pressing back button, then eventually you will reach a point when there is only one fragment in the back stack. At this point, you will want to do one of the two things

  1. Remove the activity housing the fragment from the back stack of the task in which activity is running. This is because you do not want to end up with a blank activity
  2. If the activity is the only activity in the back stack of the task, then push the task in background.

In my case, it was the later, so I modified the overridden onBackPressed method from my previous answer to look like below

@Overridepublic void onBackPressed() {    if(getFragmentManager().getBackStackEntryCount() == 1) {        moveTaskToBack(false);    }    else {        super.onBackPressed();    }}

This code is simpler because it has less logic and it relies on framework than on our custom code. Unfortunately I did not manage to implement code for first situation as I did not need to.