web-dev-qa-db-fra.com

java.lang.RuntimeException: nom d'animation inconnu: objectAnimator

Je reçois cette erreur lors de l'utilisation

getActivity().getSupportFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(
                                R.animator.card_flip_right_in, R.animator.card_flip_right_out,
                                R.animator.card_flip_left_in, R.animator.card_flip_left_out)
                        .replace(R.id.content_fragment, new DaysSinceBirthSettingFragment())
                        .addToBackStack(null)
                        .commit();

Mais quand je le change en

getActivity().getFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(
                                R.animator.card_flip_right_in, R.animator.card_flip_right_out,
                                R.animator.card_flip_left_in, R.animator.card_flip_left_out)
                        .replace(R.id.content_fragment, new DaysSinceBirthSettingFragment())
                        .addToBackStack(null)
                        .commit();

Cela fonctionne parfaitement. mais j'ai besoin de supporter une version plus ancienne, donc je dois utiliser support-v4, dont getSupportFragmentManager() vient.

J'ai lu un article disant que res/animator N'est pas pris en charge par support-v4, j'ai donc également essayé de déplacer mes fichiers XML d'animation dans le dossier res/anim Et de le référencer par R.anim.card_flip_right_in

Mais ça n'a toujours pas fonctionné, n'importe qui peut me dire ce que je peux faire?

20
Scott Zhu

Le gestionnaire de fragments de support ne prend pas en charge les animateurs (uniquement les animations). Le message d'exception indique que vous avez un format d'animation incorrect dans votre ressource xml, probablement parce que vous avez déplacé l'animateur vers ce xml qui est incorrect (car ils ont une notation différente). Vous devez l'écrire de manière appropriée: http://developer.Android.com/guide/topics/graphics/view-animation.html

23
q1p

si vous utilisez un fragment de support, ajoutez les fichiers xml ci-dessous dans res

Voici le contenu du fichier anim/fragment_slide_left_enter.xml.

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

    <alpha
        Android:duration="@Android:integer/config_mediumAnimTime"
        Android:fromAlpha="0.0"
        Android:interpolator="@Android:interpolator/decelerate_quint"
        Android:toAlpha="1.0" />
</set>

voici le contenu de anim/fragment_slide_left_exit.xml

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

    <alpha
        Android:duration="@Android:integer/config_mediumAnimTime"
        Android:fromAlpha="1.0"
        Android:interpolator="@Android:interpolator/decelerate_quint"
        Android:toAlpha="0.0" />
</set>

Le code suivant sera le contenu du fichier anim/fragment_slide_right_enter.xml

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

    <alpha
        Android:duration="@Android:integer/config_mediumAnimTime"
        Android:fromAlpha="0.0"
        Android:interpolator="@Android:interpolator/decelerate_quint"
        Android:toAlpha="1.0" />
</set>

le code suivant sera le contenu du fichier anim/fragment_slide_right_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <translate
        Android:duration="@Android:integer/config_mediumAnimTime"
        Android:fromXDelta="0%p"
        Android:interpolator="@Android:interpolator/decelerate_quint"
        Android:toXDelta="100%p" />

    <alpha
        Android:duration="@Android:integer/config_mediumAnimTime"
        Android:fromAlpha="1.0"
        Android:interpolator="@Android:interpolator/decelerate_quint"
        Android:toAlpha="0.0" />
</set>

ajoutez enfin cette ligne dans votre code de transition de fragment

ft.setCustomAnimations(R.anim.fragment_slide_left_enter,
                        R.anim.fragment_slide_left_exit,
                        R.anim.fragment_slide_right_enter,
                        R.anim.fragment_slide_right_exit)
10
Jinu