如何为BottomNavigationView导航至同一Fragment设置不同动画?
解决方案
完全可以实现,核心思路是根据导航触发的来源,动态给ProfileFragment设置不同的进入/退出动画,以下是两种可行的实现方式:
方式一:通过导航监听器动态切换动画
利用NavController的页面切换监听器,判断导航的前后页面,针对性替换动画:
先准备淡入淡出的动画资源(比如
@anim/fade_in和@anim/fade_out):fade_in.xml:<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromAlpha="0.0" android:toAlpha="1.0" />fade_out.xml:<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromAlpha="1.0" android:toAlpha="0.0" />
在宿主Activity中添加导航监听器:
navController.addOnDestinationChangedListener { _, destination, _ -> // 目标页面是ProfileFragment时触发判断 if (destination.id == R.id.profileFragment) { val prevDestId = navController.previousBackStackEntry?.destination?.id // 如果上一页是HomeFragment(即从底部导航切回的场景) if (prevDestId == R.id.homeFragment) { // 替换为淡入淡出动画 navController.navigatorProvider.getNavigator<FragmentNavigator>().apply { enterAnim = R.anim.fade_in exitAnim = R.anim.fade_out popEnterAnim = R.anim.fade_in popExitAnim = R.anim.fade_out } } else { // 其他场景(比如从SettingsFragment跳转),恢复滑动动画 navController.navigatorProvider.getNavigator<FragmentNavigator>().apply { enterAnim = R.anim.slide_right exitAnim = R.anim.slide_left popEnterAnim = R.anim.slide_left popExitAnim = R.anim.slide_right } } } }
方式二:自定义底部导航的点击行为
放弃默认的setupWithNavController,手动处理底部导航的点击事件,在切换到[B]栈时指定动画:
bottomNavigationView.setOnItemSelectedListener { item -> when (item.itemId) { R.id.homeFragment -> { navController.navigate(R.id.homeFragment) true } R.id.settingsFragment -> { val currentDestId = navController.currentDestination?.id // 当前在HomeFragment,切回Settings栈时用淡入淡出 if (currentDestId == R.id.homeFragment) { val navOptions = NavOptions.Builder() .setEnterAnim(R.anim.fade_in) .setExitAnim(R.anim.fade_out) .setPopEnterAnim(R.anim.fade_in) .setPopExitAnim(R.anim.fade_out) .build() navController.navigate(R.id.settingsFragment, null, navOptions) } else { // 其他情况用默认导航逻辑 navController.navigate(R.id.settingsFragment) } true } else -> false } }
注意事项
- 导航图中保留
SettingsFragment到ProfileFragment的滑动动画配置,确保从Settings跳转时的动画正常。 - 两种方式都需要保证动画资源已正确创建,可根据需求调整动画时长和效果。
内容的提问来源于stack exchange,提问作者Alex Char
相关产品推荐
相关产品推荐

