Search code examples
androidandroid-fragmentsback

Fragment pressing back button


I am now having an activity containing fragments

[1] , [2] , [3] , [4]

If pressing buttons , [3] , it can be redirected to [4]

I would like to implement the back button as shown follow..

when pressing back at [4] , it return to [3]

when pressing back at [3] , it return to [2]

when pressing back at [1] , the activity finishes();

When it comes to the current implementation, it finish the activity instead of popping up the Fragment. Would you please tell me what I should do or keep in mind ?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if( keyCode==KeyEvent.KEYCODE_BACK) 
    {   

        finish();
    }       

        return super.onKeyDown(keyCode, event); 

}   

Solution

  • In your onCreate() in your activity housing your fragments add a backstack change listener like so:

        fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                List<Fragment> f = fragmentManager.getFragments();
                Fragment frag = f.get(0);
                currentFragment = frag.getClass().getSimpleName();
            }
        });
    

    (Nb. my fragmentManager is declared global) Now every time you change fragment the currentFragment String will become the name of the current fragment. Then in the activities onBackPressed() you can control the actions of your back button as so:

        @Override
        public void onBackPressed() {
    
        switch (currentFragment) {
            case "FragmentOne":
                // your code here 
                return;
            case "FragmentTwo":
                // your code here
                return;
            default:
                fragmentManager.popBackStack();
                // default action for any other fragment (return to previous)
        }
    
    }
    

    I can confirm that this method works for me.

    Update : Kotlin

    override fun onBackPressed() {
    
        when(supportFragmentManager.fragments[0].javaClass.simpleName){
            "FragmentOne" -> doActionOne()
            "FragmentTwo" -> doActionTwo()
            else -> supportFragmentManager.popBackStack()
        }
    }