2017-01-09 8 views
2

J'ai un problème concernant FragmentTransaction. Donc je compte sur onDestroyView() et onStop() dans chaque Fragment pour afficher ou masquer une barre d'outils en bas de l'activité. Voilà comment je fais la transaction:Android - Le fragment est ajouté au conteneur avant que le dernier fragment ne soit supprimé

getSupportFragmentManager().beginTransaction() 
    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 
    .replace(R.id.activity_frame, fragment, tag) 
    .addToBackStack(tag) 
    .commit(); 

Quand je debug, il montre que la nouvelle Fragment passe par son onCreateView() avant la remplacer Fragment passe par onDestroyView() et onStop().

Cela vient de se produire récemment, je me suis rendu compte que la barre d'outils montrait un comportement anormal et que je n'avais pas eu l'occasion de le vérifier jusqu'à ce matin. Un indice sur ce ??

Répondre

2

Ce comportement a été modifié dans la bibliothèque de soutien il y a un certain temps, voir https://code.google.com/p/android/issues/detail?id=230415

Vous pouvez passer à l'ancien comportement comme décrit dans ce thread:

C'est un changement de comportement prévu. Il y a une nouvelle fonctionnalité pour optimiser les opérations et reporter les transitions de fragment et ceci est un effet secondaire de cela.

Vous pouvez désactiver les optimisations d'opérations fragmentées en appelant FragmentTransaction.setAllowOptimization (false). Cela force tout à se produire dans le bon ordre, mais interdit également les opérations d'optimisées.

Une autre approche serait de ne pas compter sur onDestroyView() et onStop() beeing appelés, mais la manipulation plutôt la barre d'outils déjà présents dans onCreateView() du nouveau fragment. Par exemple, en remplaçant toujours la barre d'outils par onCreateView() et en ne supprimant la barre d'outils qu'en onStop()/onDestroy() si la barre d'outils est toujours celle créée par le propre fragment.

+0

Alors, pourquoi? Je le pensais mais j'ai rétrogradé ma bibliothèque de support et ça ne change rien, je suppose que je n'ai pas downgraffé assez ... Btw c'est en fait la même barre d'outils exacte que l'activité gère. Je continue de le faire passer dans chaque fragment onDestroy ou à l'arrêt pour qu'il ne soit utilisé que dans ce fragment particulier, ou tout autre fragment qui en a besoin. –

+0

Cela le rend encore plus simple. Vous pouvez contrôler la visibilité de la barre d'outils uniquement dans onCreateView() dans une base abstraite Fragment qui définit une méthode abstraite boolean showToolbar() que vos fragments doivent implémenter. Juste un peu de remue-méninges :) – tknell

+0

Eh bien, je l'ai fait lol .. De cette réponse que vous avez donné, soulignant il y a une nouvelle méthode dans 'FragmentTransaction' qui est' .setAllowOptimization (false) 'rend tout retour à la normale, merci toi! Et oups je n'ai pas accepté ta réponse depuis hier, il était temps pour moi d'aller ailleurs lol –