12 votes

Pile arrière des fragments Android

J'ai utilisé plusieurs fragments dans mon projet. Je veux sauvegarder l'état d'un fragment et restaurer cet état lorsque je reviens à celui-ci. Dans ce fragment, je montre plusieurs images qui changent en fonction du clic sur le bouton. J'utilise le code suivant pour cela :

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();
}

Il fonctionne bien et enregistre l'état, mais il ne montre pas les images précédentes.

Toute aide, suggestion ou tutoriel serait très apprécié. Merci.

1voto

Arjun saini Points 2494

J'essaie avec la liste de fragments ....

Parapher la liste des framents

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

Code pour fragmenter le changement et reprendre la pile

   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();
}

pour le dos enlever la pile

 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();

            }
        }
    });

0voto

Naveen Kumar M Points 4060

Vous pouvez faire de la navigation circulaire en utilisant le code ci-dessous. Vous pouvez visiter même deux fragments comme vice-versa par sans fin.

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
     hideLastFragment(fragmentTransaction);
     fragmentTransaction.add(R.id.profile_fragmentContainer, youfFragment, fragmentTagName).addToBackStack(fragmentTagName);
     fragmentTransaction.commitAllowingStateLoss();

    /**
         * To hide the last fragment
         *
         * @param fragmentTransaction FragmentTransaction
         */
        public void hideLastFragment(FragmentTransaction fragmentTransaction) {
            final int backStackCount = getSupportFragmentManager().getBackStackEntryCount() - 1;
            if (backStackCount >= 0) {
                String fragmentName = getSupportFragmentManager().getBackStackEntryAt(backStackCount).getName();
                Fragment lastFragment = getSupportFragmentManager().findFragmentByTag(fragmentName);
                fragmentTransaction.hide(lastFragment);
            }
        }

0voto

nitinkumarp Points 1056

Vous pouvez utiliser le code suivant. Il ne rechargera pas le fragment lorsque vous revenez du fragment précédent :

    if (!fragmentPopped) {
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
     fragmentTransaction.hide(getFragmentManager().findFragmentById(R.id.container_body));
     fragmentTransaction.add(R.id.container_body, fragment);
     fragmentTransaction.addToBackStack(backStateName);
     fragmentTransaction.commit();
    }

0voto

Ramesh Kumar Points 924

Vous pouvez utiliser

fragmentTransaction.hide(getFragmentManager().findFragmentById(R.id.frame_container));
fragmentTransaction.add(R.id.frame_container, fragment);
fragmentTransaction.addToBackStack(null);

Au lieu de

fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.addToBackStack(backStateName);

0voto

parik dhakan Points 484

J'ai utilisé des fragments multiples avec ce code. MainActivity où est votre framelayout ou votre fragment.

@Override    
public void onBackPressed() {
  /*  Fragment fragment = new SettingActivity();
    String title = getString(R.string.app_name);
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container_body, fragment);
    fragmentTransaction.commit();
    // set the toolbar title
    getSupportActionBar().setTitle(title);*/
    //Log.e("title:", getTitle().toString());
    getSupportActionBar().setTitle("Home");
    //Log.e("title:", getTitle().toString());
    if (!getTitle().toString().equals("Home")) {

        Fragment fragment = new Activity_category();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.container_body, fragment).commit();
        this.setTitle("Home");
    } else {

        super.onBackPressed();

    }
}

Si cela peut vous aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X