J'essaie d'apprendre à utiliser Fragment
s sous Android. J'essaie de supprimer l'ancien fragment
lorsque le nouveau fragment
appelle Android.
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.
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
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.
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();
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();
}