Android导航栈回退异常:从Fragment Z返回直接回到起始页
问题场景
使用Navigation Components实现导航,配置包含Fragment A、B的BottomNavigationView:
- Fragment B可跳转至C,C可跳转至D,回退栈正常(D→C→B)
- 通过Activity共用工具栏菜单进入Fragment Z后,从Z按返回键直接回到起始页A,而非预期的D
问题原因
item.onNavDestinationSelected(navController) 默认调用navController.navigate(destinationId),对于非BottomNavigation关联的目的地,默认行为是弹出回退栈至起始页,导致从D跳转Z时回退栈被清空,返回只能到A。
解决方案
自定义菜单跳转逻辑,保留当前回退栈,具体步骤如下:
1. 修改MainActivity的菜单点击处理
替换默认的onNavDestinationSelected,手动构建导航选项,确保跳转Z时保留当前页面在回退栈中:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView( R.layout.activity_main ) val toolbar: MaterialToolbar = findViewById(R.id.toolbar) setSupportActionBar(toolbar) val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController val navView: BottomNavigationView = findViewById( R.id.bottomNavigation ) navView.setupWithNavController( navController ) } override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.menu_toolbar, menu) return super.onCreateOptionsMenu(menu) } override fun onOptionsItemSelected(item: MenuItem): Boolean { val navController = findNavController(R.id.nav_host_fragment) return when(item.itemId) { R.id.fragmentZ -> { // 配置导航选项:保留当前页面在回退栈 val navOptions = NavOptions.Builder() .setPopUpTo(navController.currentDestination?.id ?: 0, false) .build() navController.navigate(R.id.fragmentZ, null, navOptions) true } else -> item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item) } } }
2. 原理说明
setPopUpTo(navController.currentDestination?.id ?: 0, false):指定跳转时仅弹出到当前页面(不包含当前页面),保留当前页面在回退栈中- 导航到Z后,回退栈结构变为
A→B→C→D→Z,按返回键会依次回到D→C→B,符合预期
备选方案(通过导航图配置)
若偏好通过导航图配置,可给每个可能跳转至Z的Fragment添加action,例如给Fragment D添加:
<fragment android:id="@+id/fragmentD"> <action android:id="@+id/action_d_to_z" app:destination="@id/fragmentZ" app:popUpTo="@id/fragmentD" app:popUpToInclusive="false"/> </fragment>
此方式需给所有可能跳转Z的页面逐一配置,灵活性不如代码处理。
内容的提问来源于stack exchange,提问作者Happo
相关产品推荐
相关产品推荐

