Android编程之Fragment使用动画造成Unknown animation name: objectAnimator异常

本文详细解析了在使用V4包中的Fragment进行动画切换时遇到的未知动画名异常问题,分析了原因并提供了解决方案。通过对比V4源码中的关键代码段,揭示了为何包含objectAnimator的动画文件会导致异常,并指出了解决方法。文章还附上了动画效果的实现代码和预期动画展示,帮助开发者理解和应用正确的动画标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在为Fragment做切换动画,启动后遇到了一个异常:

Caused by: java.lang.RuntimeException: Unknown animation name: objectAnimator

截图如下:


我的代码如下:

    fragment = Fragment.instantiate(getActivity(), clz.getName());
    fragment.setArguments(args);
    ft.setCustomAnimations(R.animator.fragment_rotate_enter,
            R.animator.fragment_rotate_exit,
            R.animator.fragment_rotate_pop_enter,
            R.animator.fragment_rotate_pop_exit);
    ft.replace(R.id.fragment_stub, fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);

我的动画文件如下,其他三个大同小异,就不贴出来了 :

<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <objectAnimator
        android:duration="1000"
        android:propertyName="rotationY"
        android:valueFrom="180.0"
        android:valueTo="360.0"
        android:valueType="floatType" />
    <objectAnimator
        android:duration="1000"
        android:propertyName="alpha"
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:valueType="floatType" />

</set>

对于这个异常,网上有很多说法,但我看了下解释,都没有切中要害。在这里,我给具体讲一下原因:

第一是因为我使用了objectAnimator这个动画标签,

第二是因为Fragment我使用的是V4包中的。


原因就在这里:V4包中的Fragment对于动画的支持不完全。如果手中有V4源代码的同学,可以翻出来具体看看——在FragmentManager类中的loadAnimation方法。我这里就直接贴图了:


标记处的那个位置,就是关键代码。在这里面才会处理与objectAnimator相关的标签,如截图所示:


所以,才会造成标题上那个异常。


这里我再延伸一些内容:那么V4包中的Fragment支持哪些动画标签内呢?看一下V4包中源码截图:

那个错误异常,也就是这里报出来的。


那么,是不是就不能为Fragment切换使用objectAnimator的动画标签呢?

当然也不是不能,如果你非要使用这个动画,就请使用源码中的Fragment,它是没有注释掉那段动画加载代码的。


小结:
在使用V4包中Fragment时,使用的切换动画效果,其动画文件中不能包含objectAnimator,Animator这类标签。如果必须要使用,请将工程中使用的V4包中Fragment相关类,换成源码中的Fragment
相关类。


最后,附上那个我要做的动画效果:一个翻牌的切换效果,是基于APIDemo修改的代码:

http://download.youkuaiyun.com/detail/xyz_fly/7576099


ven...ivo.hardware.fido@1.0-service E BBinder_init Processname /vendor/bin/hw/vendor.vivo.hardware.fido@1.0-service 2025-06-13 23:56:11.547 6920-6920 vendor.viv....0-service ven...ivo.hardware.fido@1.0-service E BBinder_init hasGetProcessName /vendor/bin/hw/vendor.vivo.hardware.fido@1.0-service 2025-06-13 23:56:11.548 6920-6920 AidlLazySe...eRegistrar ven...ivo.hardware.fido@1.0-service I Registering service vendor.vivo.hardware.fido.IFidoDaemon/default 2025-06-13 23:56:21.325 31338-31338 AndroidRuntime com.example.kucun2 E FATAL EXCEPTION: main Process: com.example.kucun2, PID: 31338 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference at com.example.kucun2.ui.dingdan.OrderDisplayFragment$3.onAnimationEnd(OrderDisplayFragment.java:526) at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:733) at android.animation.Animator$AnimatorCaller$$ExternalSyntheticLambda1.call(D8$$SyntheticClass:0) at android.animation.Animator.callOnList(Animator.java:691) at android.animation.Animator.notifyListeners(Animator.java:624) at android.animation.Animator.notifyEndListeners(Animator.java:654) at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1315) at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1575) at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:496) at android.animation.AnimationHandler.-$$Nest$mdoAnimationFrame(Unknown Source:0) at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:110) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2457) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2468) at android.view.Choreographer.doCallbacks(Choreographer.java:1693) at android.view.Choreographer.doFrame(Choreographer.java:1422) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:2284) at android.os.Handler.handleCallback(Handler.java:1014) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loopOnce(Looper.java:250) at android.os.Looper.loop(Looper.java:340) at android.app.ActivityThread.main(ActivityThread.java:9913) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957) 1970-01-01 08:00:00.000 0-0 <no-tag> I ---------------------------- PROCESS ENDED (31338) for package com.example.
最新发布
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值