web-dev-qa-db-fra.com

Animation des fragments et de la pile arrière

J'ai du mal à utiliser ou à comprendre comment le fait d'extraire FragmentTransactions de la pile arrière gère les animations personnalisées. Plus précisément, je m'attends à ce qu'il appelle l'animation "out", mais cela ne semble pas.

J'ai une méthode simple pour gérer une transaction de fragment (FragmentTransaction) où j'ajoute un fragment et j'applique une transition personnalisée pour qu'elle se fade-in/fade-out. J'ajoute également cela à la pile arrière afin que l'utilisateur puisse annuler cette transaction avec le bouton de retour, naviguant essentiellement vers l'état avant l'ajout du fragment.

protected void changeFragment() { 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.setCustomAnimations(Android.R.anim.fade_in, Android.R.anim.fade_out); 
    ft.add(R.id.fragment_container, new TestFragment()); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

Tout fonctionne très bien pour aller de l'avant, mais lorsque l'utilisateur clique sur le bouton Précédent, les animations de transition ne s'inversent pas. Ce à quoi je m'attendais, c'est que lorsque le fragment serait supprimé, il utiliserait l'animation de fondu sortant. Au lieu de cela, il semble sortir (sans animation), puis le conteneur semble apparaître. Je ne suis pas sûr que c'est exactement ce qui se passe, mais le fragment ne disparaît définitivement pas.

Mon application utilise la bibliothèque de compatibilité pour ajouter la prise en charge des fragments, mais je suppose que cela s'applique également à Honeycomb (Android-11). Est-ce que quelqu'un sait si je fais juste quelque chose de mal ici ou si j'attends juste trop? Idéalement, je voudrais animer les fragments de la même manière que Gmail (sur le Xoom) en ce qui concerne la progression en cliquant sur un message, puis en arrière en utilisant le bouton de retour. De préférence, je n'ai pas à remplacer la fonctionnalité du bouton de retour et à suivre mon propre état de fragment, car je pourrais avoir plusieurs "transactions" que je voudrais annuler et je ne suis pas un fan de réinventer les roues.

Également demandé sur le Android Developers Group: http://groups.google.com/group/Android-developers/browse_thread/thread/1136a3a70fa0b6e9

54
Kelly Merrell

Le bug a été corrigé dans la version 3.2 avec l'ajout de la nouvelle API suivante:

http://developer.Android.com/reference/Android/app/FragmentTransaction.html#setCustomAnimations (int, int, int, int)

Il est à noter qu'il n'a pas encore été porté sur la bibliothèque de compatibilité (comme mentionné dans le rapport de bogue).

29
kajham

J'utilise ceci:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out);

et les transitions fonctionnent en sens inverse lorsque le bouton de retour est enfoncé.

49
user742030

C'est un bug, regardez rapport de bug 1562 . L'un des membres du projet Android Android a déclaré que le correctif était trop tard pour la version 3.1, mais qu'il devrait être intégré dans la prochaine version.

Le même député poursuit en disant que ...

Le problème est que les mêmes animations sont exécutées sur une opération pop que celles exécutées pour placer les fragments à leur emplacement actuel. Par exemple, dans l'exemple coulissant ci-dessus, lors d'une opération vers l'avant (pousser l'ancien fragment sur la pile et déplacer le nouveau fragment en vue), nous faisons glisser l'ancien fragment du centre vers la gauche et faisons glisser le nouveau fragment depuis le droit au centre. Lorsque la pile est éclatée, ces mêmes animations sont exécutées: le fragment le plus récent est animé "en dehors" en le faisant glisser de la droite vers le centre (après quoi il disparaît, car il est supprimé). L'ancien fragment est sorti de la pile et animé du centre vers la gauche ... à droite de l'écran.

5
Gallal