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

后端 未结 10 1420
悲&欢浪女
悲&欢浪女 2020-11-27 04:49

I have only one activity and multiple fragments in my application.

Two main fragment A(left) and B(right).



        
相关标签:
10条回答
  • 2020-11-27 05:26

    You have to implement your own backstack implementation as explained here.

    You can call the popFragments() whenever you click the back button in a fragment and call pushFragments() whenever you navigate from one Fragment to other.

    0 讨论(0)
  • 2020-11-27 05:37
    public void onBackPressed()
    {
        FragmentManager fm = getActivity().getSupportFragmentManager();
        fm.popBackStack();
    }
    
    0 讨论(0)
  • 2020-11-27 05:39

    @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

    @Override
    public 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 here
    FragmentManager 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

    @Override
    public 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.

    0 讨论(0)
  • 2020-11-27 05:42

    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:

    @Override
    public 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:

    @Override
    public 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.

    @Override
    public 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

    0 讨论(0)
  • 2020-11-27 05:42

    Just Do

    getActivity().getFragmentManager().popBackStack();
    
    0 讨论(0)
  • 2020-11-27 05:44

    Back button will traverse in the order, in which Fragments were added to backstack. This is provided as a navigation function by default. Now if you want to go to specific Fragment, you can show it from backstack.

    0 讨论(0)
提交回复
热议问题