Fragment转场动画的那些坑(仅分析v4包下的fragment)

前言

一些小伙伴在使用Fragment的时候,其实默认是没有转场动画的,在开发过程中,某些特定的需求场景下,是需要使用转场动画的,原生的Fragment其实也是为此提供了API支持的,就是写起来稍微有些麻烦,那么小伙伴们,在使用转场动画的时候,都遇到了那些大坑呢?

getFragmentManager().beginTransaction().setCustomAnimations(enter, exit) 
// 如果你有通过tag/id同时出栈多个Fragment的情况时, 
// 请谨慎使用.setCustomAnimations(enter, exit, popEnter, popExit) 
// 在support-25.4.0之前出栈多Fragment时,伴随出栈动 画,会在某些情况下发生异常 
// 你需要搭配Fragment的onCreateAnimation()临时取消出 栈动画,或者延迟一个动画时间再执行一次上面提到的Hack方法,排序

注意:如果你想给下一个Fragment设置进栈动画和出栈动画,.setCustomAnimations(enter, exit)只能设置进栈动画,第二个参
数并不是设置出栈动画;
请使用.setCustomAnimations(enter, exit, popEnter, popExit),这个方法的第1个参数对应进栈动画,第4个参数对应出栈动画,所以是.setCustomAnimations(进栈动画, exit, popEnter, 出栈动画))

总结起来就是Fragment没有出栈动画的话,可以避免很多坑。如果想让出栈动画运作正常的话,需要使用Fragment的 onCreateAnimation中控制动画。

@Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { // 此处设置动画 }

但是使用代价也是有的,你需要解决出栈动画带来的几个坑。

1. pop多个Fragment时转场动画 带来的问题

在使用 pop(tag/id)出栈多个Fragment的这种情况下,将转场动画临时取消或者延迟一个动画的时间再去执行其他事务;

原因在于这种情景下,可能会导致栈内顺序错乱(上文有提到),同时如果发生“内存重启”后,因为Fragment转场动画没结束时再执行其他方法,会导致Fragment状态不会被FragmentManager正常保存下来。

2. 进入新的Fragment并立刻关闭当前Fragment 时的一些问题

2.1 如果你想从当前Fragment进入一个新的Fragment,并且同时要关闭当前Fragment。由于数据结构是栈,所以正确做法是先pop,再add,但是转场动画会有覆盖的不正常现象,你需要特殊处理,不然会闪屏!

如果你遇到Fragment的mNextAnim空指针的异常(通常是在你的Fragment被重启的情况下),那么你首先需要检查是否操作的
Fragment是否为null;其次在你的Fragment转场动画还没结束时,你是否就执行了其他事务等方法;解决思路就是延迟一个动画时间再执行事务,或者临时将该Fragment设为无动画。

归纳

在使用Fragment的时候,其实有很多的坑,不过在遇到问题的时候,在网上都能找到相对应的解决问题的方法。

如果你只是浅度使用,比如一个Activity容器包含列表Fragment+详情Fragment这种简单情景下,不涉及到popBackStack/Immediate(tag/id)这些的方法,还是比较轻松使用的,出现的问题,网上都可以找到解决方案。

但是如果你的Fragment逻辑比较复杂,有特殊需求,或者你的app架构是仅有一个Activity + 多个Fragment,上面说的这些坑,你都应该全部解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DT从零到壹

您的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值