2011-08-19 8 views
37

J'en ai un Activity. Le Activity a deux Fragment s. Le fragment A est Menu. Le fragment B est le détail.Comment détruire un fragment?

J'essaie de créer un autre fragment C dans le fragment B, donc, il y a 3 fragments dans le Activity. Et j'essaie de remplacer le fragment B par le fragment D.

Je suppose que les fragments B et C sont morts. MAIS ces Fragments sont vivants. Juste Fragments sont onDestroyView() état. Je veux onDestroy() ou onDetach(). Que faire pour Fragments.onDestroy() ou onDetach()? Je ne peux pas détruire ou changer le Activity.

+0

Vous remplacez en ajoutant à la pile de retour? Si c'est le cas, je ne m'attends pas à ce que le fragment soit détruit. Si vous n'êtes alors pas ajouter la transaction à la pile arrière sur un remplacement. – PJL

Répondre

54

Si vous ne supprimez pas manuellement ces fragments, ils sont toujours liés à l'activité. Votre activité n'est pas détruite donc ces fragments le sont aussi. Pour enlever (si destroy) ces fragments, vous pouvez appeler:

fragmentTransaction.remove(yourfragment).commit() 

espère que cela vous aide à vous

+0

Cela m'a aidé avec le crash "Duplicate id" redouté. Merci! – xorgate

+0

lorsqu'un fragment est supprimé, quelle méthode de cycle de vie de fragment est appelée? De même, lorsqu'un fragment est remplacé, quelle méthode du cycle de vie du fragment est appelée? –

+4

Wow, cela rend la documentation de Google pour replace() totalement fausse: '' C'est essentiellement le même que d'appeler remove (Fragment) pour tous les fragments ajoutés qui ont été ajoutés avec le même containerViewId, puis ajouter (int, Fragment, String) avec les mêmes arguments donnés ici. »En réalité, seul l'appel de remove() détruit le fragment et ne le remplace pas. – 0101100101

9

donner un essai à ce

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    // TODO Auto-generated method stub 

    FragmentManager manager = ((Fragment) object).getFragmentManager(); 
    FragmentTransaction trans = manager.beginTransaction(); 
    trans.remove((Fragment) object); 
    trans.commit(); 

    super.destroyItem(container, position, object); 
} 
2

Si vous êtes dans le fragment lui-même, vous devez appeler cela. yourFragment doit être le fragment appelé.Entrez le code:

getFragmentManager(). beginTransaction(). remove (votreFragment) .commitAllowingStateLoss();

ou si vous utilisez supportLib, alors vous devez appeler:..

getSupportFragmentManager() beginTransaction() retirer (yourFragment) .commitAllowingStateLoss();

-1

Il est utilisé dans Kotlin

appCompatActivity?.getSupportFragmentManager()?.popBackStack()