AndroidX FragmentTransaction返回键动画失效问题求助
解决AndroidX下Fragment返回键动画失效问题
我看你从support库切换到AndroidX后,遇到了Fragment返回键动画直接失效、Fragment被直接移除的问题,这就帮你捋清楚问题出在哪以及怎么解决:
首先得明确一个核心差异:你之前用support库的代码没有调用addToBackStack(null);,按下返回键是直接退出Activity,不需要处理Fragment弹出的动画;但现在的代码加入了返回栈,返回时是从栈中弹出当前Fragment,这时候就必须正确设置返回栈弹出时的动画参数,这也是你现在动画失效的关键原因。
问题核心:setCustomAnimations参数顺序搞混了
AndroidX的FragmentTransaction.setCustomAnimations(int enter, int exit, int popEnter, int popExit)四个参数的含义是:
- 第一个参数:新Fragment进入容器时的动画
- 第二个参数:旧Fragment离开容器时的动画
- 第三个参数:从返回栈弹出时,上一个Fragment重新进入的动画
- 第四个参数:从返回栈弹出时,当前Fragment离开的动画
你现在把第三、第四个参数都设成了R.anim.slide_out_top,相当于返回时上一个Fragment也在往外滑,自然看不到动画效果,Fragment就直接被移除了。
正确的代码写法
假设你想要的效果是:
- 切换Fragment:新Fragment从顶部滑入,旧Fragment从顶部滑出
- 返回时:当前Fragment从顶部滑出,上一个Fragment从底部滑入
那代码应该改成这样:
ft = getSupportFragmentManager().beginTransaction(); // 严格按照enter, exit, popEnter, popExit的顺序设置动画 ft.setCustomAnimations( R.anim.slide_in_top, // 新Fragment进入动画 R.anim.slide_out_top, // 旧Fragment退出动画 R.anim.slide_in_bottom, // 返回时,上一个Fragment的进入动画 R.anim.slide_out_top // 返回时,当前Fragment的退出动画 ); ft.replace(R.id.menu_fragment, menuFragment); ft.addToBackStack(null); ft.commit();
额外注意点:确保动画资源正确
你需要检查你的动画xml文件是否符合预期,比如:
slide_in_top.xml(新Fragment从顶部滑入):
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromYDelta="-100%" android:toYDelta="0%" /> </set>
slide_out_top.xml(Fragment从顶部滑出):
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromYDelta="0%" android:toYDelta="-100%" /> </set>
slide_in_bottom.xml(上一个Fragment从底部滑入):
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromYDelta="100%" android:toYDelta="0%" /> </set>
这样调整后,返回键的动画应该就能正常工作了。另外,不管用replace还是add,只要正确设置了这四个动画参数,并且调用了addToBackStack,动画都会生效的。
内容的提问来源于stack exchange,提问作者oto
相关产品推荐
相关产品推荐

