Android中BottomNavigationView使用setOnItemSelectedListener后返回键行为异常修复
问题原因
默认通过setupWithNavController绑定BottomNavigationView与NavController时,系统会自动将底部导航的各个页面标记为顶级目的地,切换页面时不会将新页面添加到返回栈,而是替换当前栈顶,因此返回键会直接回到startDestination(首页)。
但你手动使用setOnItemSelectedListener并调用navController.navigate()时,每次切换都会把新Fragment添加到返回栈中,导致返回键需要逐个弹出栈内页面,出现C -> B -> A的非预期路径。
解决方案
方案1:使用官方推荐的绑定方式(优先选择)
直接用NavigationUI.setupWithNavController替代自定义的选中监听,自动实现默认的返回栈逻辑:
// 删除你原来的setOnItemSelectedListener代码,替换为以下一行 NavigationUI.setupWithNavController(bottomNavigationView, navController)
方案2:自定义监听时手动控制返回栈
如果必须保留自定义的选中逻辑,可通过NavOptions配置导航参数,确保每次切换页面时清除startDestination之外的返回栈内容:
bottomNavigationView.setOnItemSelectedListener { menuItem -> // 配置导航选项:弹出到首页,保留首页,且避免重复添加相同页面 val navOptions = NavOptions.Builder() .setPopUpTo(R.id.homeFragment, inclusive = false) .setLaunchSingleTop(true) .build() when(menuItem.itemId) { R.id.homeFragment -> navController.navigate(R.id.homeFragment, null, navOptions) R.id.favoriteFragment -> navController.navigate(R.id.favoriteFragment, null, navOptions) R.id.profileFragment -> navController.navigate(R.id.profileFragment, null, navOptions) } true }
setPopUpTo(R.id.homeFragment, inclusive = false):导航时弹出返回栈中homeFragment之上的所有页面,仅保留首页setLaunchSingleTop(true):如果当前页面已经是目标页面,不会重复添加到栈中
内容的提问来源于stack exchange,提问作者onesector
相关产品推荐
相关产品推荐

