Android Fragment返回时反向播放切页动画的实现问题
问题原因
你当前的核心问题是setCustomAnimations的回退动画参数配置错误,同时预先定义的动画变量赋值也存在错误。
修复步骤
1. 修正动画变量赋值
你原来的变量赋值存在重复引用问题,先调整为正确的对应关系:
// 正向跳转时:新Fragment从右侧滑入 int enterAnim = R.anim.slide_in_right; // 正向跳转时:旧Fragment从左侧滑出 int exitAnim = R.anim.slide_out_left; // 回退时:要恢复的旧Fragment从左侧滑入 int popEnterAnim = R.anim.slide_in_left; // 回退时:当前Fragment从右侧滑出 int popExitAnim = R.anim.slide_out_right;
2. 正确配置FragmentTransaction的自定义动画
setCustomAnimations四个参数的含义依次为:正向进入动画、正向退出动画、回退进入动画、回退退出动画,直接按上面的变量顺序传入即可,不需要你之前注释的自行判断currentFragment和lastFragment的逻辑,FragmentManager回退栈会自动触发回退动画。
3. 修正后的完整业务代码
int enterAnim = R.anim.slide_in_right; int exitAnim = R.anim.slide_out_left; int popEnterAnim = R.anim.slide_in_left; int popExitAnim = R.anim.slide_out_right; //底部导航栏 BottomNavigationView bottomNav = findViewById(R.id.nav_menu); //导航栏下方选项选中时的事件监听器 bottomNav.setOnItemSelectedListener(item -> { Fragment selectedFragment = null; switch(item.getItemId()){ case R.id.nav_home: selectedFragment = new HomeFragment(dbHelper, db); break; case R.id.nav_list: selectedFragment = new ListFragment(dbHelper, db); break; case R.id.nav_add: selectedFragment = new AddFragment(dbHelper, db); break; } getSupportFragmentManager().beginTransaction() .setCustomAnimations(enterAnim, exitAnim, popEnterAnim, popExitAnim) .replace(R.id.fragment_container, selectedFragment) .addToBackStack(null) .commit(); return true; });
4. 可选优化(避免回退栈栈底残留空白页)
如果点击返回键到最后一页之后再点击返回会出现空白页,可重写onBackPressed方法判断回退栈数量:
@Override public void onBackPressed() { if (getSupportFragmentManager().getBackStackEntryCount() == 1) { // 回退栈只剩最后一个Fragment时直接关闭页面 finish(); } else { super.onBackPressed(); } }
你提供的四个动画xml文件本身逻辑都是正确的,不需要修改,按上述代码调整后即可实现正向跳转右滑入,回退时右滑出的对应反向动画效果。
内容的提问来源于stack exchange,提问作者noobieCoder
相关产品推荐
相关产品推荐

