web-dev-qa-db-fra.com

Android - Animation personnalisée sur une transaction de fragment non exécutée

J'utilise Google API 8 (Android 2.2) avec le package de support technique v4.

Cela ne donne aucune erreur ou animation. 

Transaction:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.replace(R.id.content, myFragment);
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.commit();

Animations:

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <translate
        Android:duration="700"
        Android:fromXDelta="-100%"
        Android:toXDelta="0%" >
    </translate>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate
        Android:duration="700"
        Android:fromXDelta="0%"
        Android:toXDelta="100%" >
    </translate>
</set>

Est-ce que quelqu'un sait ce qui se passe ici?

72
adheus

Le responsable empilait ma transaction avant de définir l'animation. Il empile donc la transaction sans animations (triste mais vrai), et cela se produit même si je valide la transaction après le setCustomAnimations().

La solution consiste à définir les animations en premier:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.replace(R.id.content, myFragment);
transaction.commit();
229
adheus

Comme suggéré ci-dessus, des déclarations séparées fonctionneront certainement. Mais le truc ici est à setCustomAnimation avant de définir le type de transaction à savoir .add, replace, etc. Donc, en appliquant la même logique, method chaining fonctionne également. par exemple. 

getSupportFragmentManager().beginTransaction().
                setCustomAnimations(R.anim.a_slide_up, R.anim.a_slide_down, R.anim.a_slide_up, R.anim.a_slide_down).
                add(R.id.root_layout, MyFrag.newInstance().
                addToBackStack("MyFrag").
                commit();

En le mettant ici, pour que quelqu'un qui préfère method chaining le trouve utile. À votre santé!

15
Harisewak

Laissant ceci ici comme c'est la question la plus populaire. J'ai eu le même problème avec la transaction de fragment n'animant pas. Le coupable avait l’attribut Android:animateLayoutChanges défini sur true dans la présentation correspondante.

J'espère que cela aidera quelqu'un à gagner du temps à la recherche d'une solution, car il peut être difficile de s'en apercevoir lorsqu'on dispose de mises en page imbriquées dans différents fichiers.

4

Une autre raison peut être de placer inutilement fragmentTransaction.show() avant le commit. Cela fait que les transitions pop n'apparaissent pas sur certaines versions de l'API Android.

0