web-dev-qa-db-fra.com

Transition standard de fragment non animée

J'utilise la bibliothèque de compatibilité v4 Android Android pour développer une interface utilisateur de tablette à l'aide de fragments spécifiquement pour les appareils Android 2.2 et plus).

Tout fonctionne comme il se doit, sauf que je ne peux faire fonctionner aucune animation, pas même les animations standard.

Code:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ABCFragment abcFragment = new ABCFragment();
    ft.replace(R.id.main_frame_layout_fragment_holder,abcFragment);     
    ft.addToBackStack(null);
    ft.commit();

Au lieu d'utiliser une animation de transit, le fragment se fige pendant environ une seconde et le juste disparaît et le nouveau apparaît.

En utilisant:

ft.setCustomAnimations(Android.R.anim.slide_in_left,Android.R.anim.slide_out_right);

ne fonctionne pas non plus.

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res/com.synergygb.mycustomapp"
Android:id="@+id/LinearLayout01" Android:layout_width="fill_parent"
Android:layout_height="fill_parent" Android:orientation="vertical"
Android:gravity="bottom">
<FrameLayout Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:id="@+id/main_frame_layout_fragment_holder">
</FrameLayout>
<!-- OTHER FIXED UI ELEMENTS-->
</RelativeLayout>

J'ai lu que l'animation personnalisée avait été interrompue dans la bibliothèque de compatibilité, mais personne ne semble avoir de problèmes avec les transitions standard. Je l'ai testé sur un émulateur Motorola Xoom 3.2.1, 2.3 Galaxy Tab 7 ", 2.2, et même sur un HTC G2 avec 2.3.4.

Qu'est-ce qui pourrait mal ici?

44
blindstuff

J'ai finalement réussi à le faire fonctionner après de nombreux essais et erreurs.

Tout d'abord, obtenez la dernière ACL, elle a corrigé des animations personnalisées, et bien que ce ne soit pas mon problème exact, une fois que cela a fonctionné, j'ai fini par les utiliser à la place des transitions standard.

En ce moment j'utilise:

ft.setCustomAnimations(Android.R.anim.fade_in,Android.R.anim.fade_out,Android.R.anim.fade_in,Android.R.anim.fade_out);

La clé pour le faire fonctionner à la fois sur Android 2.1, 2.2 et 2.3, ainsi que sur Android 3.0+ était de faire ce qui suit:

  • Assurez-vous que vous utilisez UNIQUEMENT les API disponibles au niveau d'API le plus bas que vous souhaitez prendre en charge (dans mon cas 2.1).
  • Compilez en utilisant Android 3.0.
  • Dans le fichier manifeste, définissez Android:hardwareAccelerated="true" à l'intérieur de votre balise d'application.

Les animations de fragments fonctionnent désormais sur tous les appareils. Si vous ne définissez pas les informations supplémentaires dans la balise d'application, l'animation se produira, mais de manière très très saccadée, donnant l'impression que cela ne s'est pas produit du tout.

J'espère que cela aidera quelqu'un à l'avenir!

Remarque: il existe des outils de vérification des API, vous êtes donc sûr de ne pas utiliser d'API qui ne sont pas à votre disposition. Je préfère travailler sur 2.1 pour que le IDE ne montre rien que je ne puisse pas utiliser, une fois que j'ai du code stable, je reviens à la compilation sur 3.0

36
blindstuff

Essayez à nouveau d'obtenir la liste de contrôle d'accès la plus récente, ils l'ont corrigée: http://code.google.com/p/Android/issues/detail?id=15623#c19

J'ai également remarqué que pour setCustomAnimations, il doit être défini avant les appels de transaction comme replace afin de prendre effet.

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.in_from_left, R.anim.out_to_right, R.anim.in_from_right, R.anim.out_to_left);
ft.replace(Android.R.id.content, newFrag);
ft.addToBackStack(null);
ft.commit();
34
dvd

Vous devez appeler setCustomAnimationsavant vous ajoutez le fragment. Cela permet d'ajouter plusieurs fragments avec différentes animations.

4
Greg Ennis

pour effectuer une animation top_to_bottom pour un fragment,

suivez la même pour faire de haut en bas

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.top_to_bottom_fragment,
Android.R.animator.fade_out); ft.replace(R.id.simple_fragment,
fragment); 
ft.commit();

top_to_bottom_fragment.xml

<objectAnimator Android:duration="400" Android:valueFrom="-800"
    Android:valueTo="0" Android:propertyName="y"
    Android:valueType="floatType"
    xmlns:Android="http://schemas.Android.com/apk/res/Android" />

valueFrom="-800" indique le bas de la disposition de votre fragment.

4
CoDe

J'ai ajouté la prise en charge NineOldAndroids à la bibliothèque d'assistance Google. Voir http://www.github.com/kedzie/Support_v4_NineOldAndroids pour plus de détails. Il permet d'utiliser des animations de propriétés pour les transitions de fragments, les PageTransformers et d'autres éléments.

3
mark.kedzierski

J'espère que cela aide quelqu'un. Les documents de l'API disent utiliser objectAnimator pour les animations de fragments, mais même avec le dernier package de compatibilité objectAnimator en xml n'a pas été accepté par le compilateur.

Cela fonctionne pour moi:

Pour Android 3.0 ou supérieur: déclarez xml objectAnimator dans le dossier res/animator.

Avec le package de compatibilité pour moins de 3.0: déclarez l'animation xml dans le dossier res/anim.

0
Gunnar Karlsson