Fragments Android et animation

Comment devez-vous implémenter le type de glissement utilisé par exemple par le client Honeycomb Gmail?

TransactionManager peut-il gérer cela automatiquement en ajoutant et en supprimant les Fragments, il est difficile de le tester car l’émulateur est un diaporama 🙂

Pour animer la transition entre les fragments ou pour animer le processus d’affichage ou de masquage d’un fragment, utilisez le Fragment Manager pour créer une Fragment Transaction .

Dans chaque transaction de fragmentation, vous pouvez spécifier des animations d’entrée et de sortie qui seront utilisées pour les afficher et les masquer respectivement (ou les deux lorsque le remplacement est utilisé).

Le code suivant montre comment remplacer un fragment en faisant glisser un fragment et en glissant l’autre à sa place.

 FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); DetailsFragment newFragment = DetailsFragment.newInstance(); ft.replace(R.id.details_fragment_container, newFragment, "detailFragment"); // Start the animated transition. ft.commit(); 

Pour obtenir la même chose en masquant ou en affichant un fragment, appelez simplement ft.show ou ft.hide , en transmettant le fragment que vous souhaitez afficher ou masquer.

Pour référence, les définitions d’animation XML utiliseraient la balise objectAnimator . Un exemple de slide_in_left pourrait ressembler à ceci:

     

Si vous n’avez pas besoin d’utiliser la bibliothèque de support, jetez un coup d’œil à la réponse de Roman .

Mais si vous souhaitez utiliser la bibliothèque de support, vous devez utiliser l’ancienne structure d’animation décrite ci-dessous.

Après avoir consulté les réponses de Reto et de blindstuff, j’ai obtenu le code suivant.

Les fragments apparaissent en glissant vers la droite et glissent vers la gauche lorsque le dos est enfoncé.

 FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit); CustomFragment newCustomFragment = CustomFragment.newInstance(); transaction.replace(R.id.fragment_container, newCustomFragment ); transaction.addToBackStack(null); transaction.commit(); 

La commande est importante. Cela signifie que vous devez appeler setCustomAnimations() avant replace() ou que l’animation ne prendra pas effet!

Ensuite, ces fichiers doivent être placés dans le dossier res / anim .

enter.xml :

     

exit.xml :

    

pop_enter.xml :

    

pop_exit.xml :

     

La durée des animations peut être modifiée en l’une des valeurs par défaut telles que @android:integer/config_shortAnimTime ou tout autre nombre.

Notez que si, entre deux remplacements de fragments, une modification de configuration se produit (par exemple une rotation), l’action de retour n’est pas animée. C’est un bogue documenté qui existe toujours dans la version 20 de la bibliothèque de support.

S’il vous plaît utilisez ceci, je pense que de bien meilleures solutions. Android Studio Fournit une animation par défaut.

fragmentTransaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);

  FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); fragmentManager.addOnBackStackChangedListener(this); fragmentTransaction.replace(R.id.frame, firstFragment, "h"); fragmentTransaction.addToBackStack("h"); fragmentTransaction.commit(); 

Sortie:

entrer la description de l'image ici

Ma bibliothèque de support modifiée prend en charge l’utilisation des animations View (c.-à-d. , ) et des animateurs d’objects ( ) pour les transitions de fragment. Il est implémenté avec NineOldAndroids . Reportez-vous à ma documentation sur github pour plus de détails.

Je résous le chemin ci-dessous

 Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide); fg.startAnimation(anim); this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment