一些小伙伴在使用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) { // 此处设置动画 }
但是使用代价也是有的,你需要解决出栈动画带来的几个坑。
在使用 pop(tag/id)
出栈多个Fragment的这种情况下,将转场动画临时取消或者延迟一个动画的时间再去执行其他事务;
原因在于这种情景下,可能会导致栈内顺序错乱(上文有提到),同时如果发生“内存重启”后,因为Fragment转场动画没结束时再执行其他方法,会导致Fragment状态不会被FragmentManager正常保存下来。
如果你遇到Fragment的mNextAnim空指针的异常(通常是在你的Fragment被重启的情况下),那么你首先需要检查是否操作的
Fragment是否为null;其次在你的Fragment转场动画还没结束时,你是否就执行了其他事务等方法;解决思路就是延迟一个动画时间再执行事务,或者临时将该Fragment设为无动画。
在使用Fragment的时候,其实有很多的坑,不过在遇到问题的时候,在网上都能找到相对应的解决问题的方法。
如果你只是浅度使用,比如一个Activity容器包含列表Fragment+详情Fragment
这种简单情景下,不涉及到popBackStack/Immediate(tag/id)
这些的方法,还是比较轻松使用的,出现的问题,网上都可以找到解决方案。
但是如果你的Fragment逻辑比较复杂,有特殊需求,或者你的app架构是仅有一个Activity + 多个Fragment
,上面说的这些坑,你都应该全部解决。