support-v4:27.1.0中Fragment自定义及出入动画异常问题咨询
我之前在项目里用这个版本的support-v4时,也踩过Fragment动画的坑,折腾了好一阵子才搞定,给你分享几个亲测有效的解决思路:
确保使用正确的
setCustomAnimations重载方法
这个版本的support库有个小坑:如果只传入进入和离开两个动画参数,在某些场景(比如加入返回栈的事务)下动画会失效。一定要用包含四个参数的重载,把返回栈弹出时的动画也补上:getSupportFragmentManager() .beginTransaction() // 顺序:进入动画、离开动画、返回栈弹出时的进入动画、返回栈弹出时的离开动画 .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right) .replace(R.id.fragment_container, new TargetFragment()) .addToBackStack(null) .commit();哪怕你不需要返回栈的动画,也可以传入和前两个相同的资源ID,别省略这两个参数。
检查动画资源的兼容性
27.1.0对属性动画的支持有一些小问题,如果你用的是animator目录下的ObjectAnimator动画,可能会出现不生效的情况。可以先换成anim目录下的补间动画试试,比如:<!-- anim/slide_in_right.xml --> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="100%p" android:toXDelta="0" android:duration="300"/>如果一定要用属性动画,确保动画里只使用基础属性(比如
translationX、alpha),避免translationZ这类较新的属性,同时用对应Animator资源的重载方法设置。排查事务提交的生命周期时机
别在Activity的onCreate方法早期(比如还没调用setContentView之后不久)就提交Fragment事务,也不要在onPause、onStop这类生命周期里提交。最好在onStart或者onPostCreate之后提交,确保Activity的视图已经初始化完成,动画才能正常触发。尝试调整support库版本
27.1.0确实存在Fragment动画的已知bug,很多开发者反馈降级到27.0.2或者升级到28.0.0(support库的最终版本)后问题解决。如果项目允许,修改build.gradle里的依赖:implementation 'com.android.support:support-v4:27.0.2'长远来看,更建议迁移到AndroidX,毕竟support库已经停止维护,AndroidX的Fragment组件修复了大量旧版本的bug。
检查是否有代码或第三方库干扰
看看你的Fragment代码里有没有在onCreateView、onViewCreated里调用view.setAnimation(null)之类的代码,或者有没有用路由框架、页面管理库接管了Fragment事务——这类库可能会覆盖你的自定义动画设置,需要在配置里开启允许自定义动画的选项,或者暂时禁用库的动画功能测试原生动画是否正常。
如果试了这些方法还是不行,可以把你的动画xml代码和Fragment事务的完整代码贴出来,这样能更精准地定位问题~
内容的提问来源于stack exchange,提问作者Abdelstar Ahmed

