permuter un fragment dans une activité via une animation

94

Je veux échanger deux fragments dans une activité via une animation. Supposons que PageA est pour le fragement A et le côté gauche de l'écran et PageB est pour le fragment B, c'est-à-dire sur le côté droit de l'écran. Maintenant, je veux que lorsque je clique sur un bouton sur la pageA, alors PageA se déplace vers le côté droit de l'écran avec une animation de transition.

J'ai essayé le code ci-dessous pour remplacer la position

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

À la recherche d'un indice.

Merci d'avance.

Deepak Goel
la source
1
duplicata possible de Animate the transition between fragments
TalkLittle

Réponses:

282

Ancienne question et vous l'avez probablement déjà compris, mais pour référence future:

voici ce que vous utilisez pour définir une animation personnalisée lorsque vous remplacez un fragment via du code:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

Voici un exemple de l'animation slide_in_left:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="500"/>
</set>

Notez qu'il s'agit de l'animation si vous utilisez la bibliothèque de compatibilité. Au lieu de cela, si vous utilisez un SDK avec un support natif pour FragmentManager, votre animation ressemblera à ceci:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

Cela est dû au fait que la bibliothèque de compatibilité ne prend pas en charge le nouveau type objectAnimator et implémente à la place uniquement l'ancien cadre d'animation.

sciutand
la source
92
C'est certainement la bonne réponse. Notez que l'ordre compte! Vous devez avoir l'appel setCustomAnimations () avant les appels d'ajout / remplacement!
theelfismike
2
Alors, quelle approche devriez-vous utiliser si vous voulez la meilleure composition?
basickarl
17
Ces différentes animations ne sont pas exactement égales. Vous supposez que la largeur de votre fragment est égale à 1280 en utilisant une valeur de -1280. Si la largeur était plus grande, elle ne démarrera pas complètement hors de l'écran.
egfconnor
53
Vous pouvez utiliser les animations prédéfinies de l'espace de noms Android à la place: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy
2
Les animations prédéfinies déclenchent une exception d'exécution, FWIW, car elles reposent sur la balise "translate".