web-dev-qa-db-fra.com

Supprimer l'ancien fragment du gestionnaire de fragments

J'essaie d'apprendre à utiliser Fragments sous Android. J'essaie de supprimer l'ancien fragment lorsque le nouveau fragment appelle Android.

56
khouloud mejdoub

Vous devez trouver la référence du fragment existant et supprimer ce fragment en utilisant le code ci-dessous. Vous devez ajouter/valider un fragment en utilisant une balise ex. "TAG_FRAGMENT".

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
    getSupportFragmentManager().beginTransaction().remove(fragment).commit();

C'est ça.

140
Yashdeep Patel

Si vous souhaitez remplacer un fragment par un autre, vous devez d'abord les ajouter de manière dynamique. Les fragments codés en dur en XML ne peuvent pas être remplacés.

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

Reportez-vous à ce message: remplacement d'un fragment par un autre fragment du groupe d'activités

Refer1: remplace un fragment par programme

17
Lokesh

J'ai eu le même problème pour enlever les vieux fragments. J'ai fini par effacer la mise en page qui contenait les fragments.

LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...

Je ne sais pas si cela crée des fuites, mais cela fonctionne pour moi.

9
Alexander

J'ai eu le même problème. Je suis venu avec une solution simple. Utiliser le fragment .replace au lieu de fragment .add. Remplacer un fragment revient à l’ajouter, puis le supprimer manuellement.

getFragmentManager().beginTransaction().replace(fragment).commit();

au lieu de

getFragmentManager().beginTransaction().add(fragment).commit();
1
Avinash Mali

Probablement vous par exemple vieux fragment il garde une référence. Voir cet article intéressant Fuites de mémoire dans Android - identifier, traiter et éviter

Si vous utilisez addToBackStack, cela conserve une référence au fragment d'instance en évitant que Garbage Collector ne supprime l'instance. L'instance reste dans la liste des fragments dans le gestionnaire de fragments. Vous pouvez voir la liste par

ArrayList<Fragment> fragmentList = fragmentManager.getFragments();

Le code suivant n’est pas la meilleure solution (car ne supprimez pas l’ancienne instance de fragment pour éviter les fuites de mémoire), mais supprimez l’ancien fragment de la liste de fragments fragmentManger

int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);

Vous ne pouvez pas supprimer l'entrée dans arrayList car FragmentManager fonctionne apparemment avec index ArrayList pour obtenir un fragment.

J'utilise habituellement ce code pour travailler avec fragmentManager

public void replaceFragment(Fragment fragment, Bundle bundle) {

    if (bundle != null)
        fragment.setArguments(bundle);

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Fragment oldFragment = fragmentManager.findFragmentByTag(fragment.getClass().getName());

    //if oldFragment already exits in fragmentManager use it
    if (oldFragment != null) {
        fragment = oldFragment;
    }

    fragmentTransaction.replace(R.id.frame_content_main, fragment, fragment.getClass().getName());

    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

    fragmentTransaction.commit();
}
1
Argonga