Search code examples
androidandroid-fragmentsback-stacksavestatefragment-backstack

Android Fragment Back Stack


I have used multiple Fragments in my Project. I want to save a Fragment's state and restore this state when I come back to this. In this Fragment I show multiple images which change on button click. I use the following code for this:

String backStateName = fragment.getClass().getName();
FragmentManager fragmentManager = getSupportFragmentManager();
boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
 fragmentTransaction.replace(R.id.container_body, fragment);
 fragmentTransaction.addToBackStack(backStateName);
 fragmentTransaction.commit();
}

It works fine & it saves state, but it does not show previous image's.

Any help, suggestion or tutorials would be highly appreciated. Thank you.


Solution

  • I am trying with the fragment list ....

    Initilize the framents list

      static List<String> fragments = new ArrayList<String>();
    

    Code to fragment change and take in back stack

       String backStateName = fragment.getClass().getName();
        FragmentManager manager = getSupportFragmentManager();
        //fragment not in back stack, create it.
        FragmentTransaction ft = manager.beginTransaction();
        if(!fragments.contains(backStateName)) {
    
           // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            // ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
            ft.replace(R.id.frame, fragment);
            ft.addToBackStack(backStateName);
            ft.commit();
    
            fragments.add(backStateName);
            System.out.println("backStateName" + fragments);
        }
        else
        {
    
    
            ft.replace(R.id.frame, fragment);
            ft.commit();
    
        }
    

    onBackpressed

     @Override
    public void onBackPressed() {
        if(fragments.size()>0)
            {
                fragments.remove(fragments.size()-1);
            }
            super.onBackPressed();
    }
    

    for back remove stack

     final android.app.FragmentManager fm = getFragmentManager();
    
        fm.addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
    
                if (getSupportFragmentManager().getBackStackEntryCount() ==0) {
                   // dLayout.closeDrawers();
                    finish();
                }
                else
                {
                   // dLayout.closeDrawers();
    
                }
            }
        });