You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在双Navigation Graph中获取当前选中的Fragment ID

获取两个Navigation Graph中当前选中Fragment的ID

嘿,这个问题我熟!要拿到两个不同Navigation Graph里当前选中Fragment的ID,核心就是分别找到每个导航图对应的NavController——毕竟每个导航图都会绑定一个独立的NavHostFragment嘛。下面给你一步步拆解具体操作:

1. 拿到Drawer导航图的当前选中Fragment ID

假设你的Drawer导航对应的NavHostFragment是放在主Activity布局里的(比如布局里它的id是nav_host_drawer),那你可以这样获取:

// 在Activity里获取Drawer导航的NavController
val drawerNavHost = supportFragmentManager.findFragmentById(R.id.nav_host_drawer) as NavHostFragment
val drawerNavController = drawerNavHost.navController
// 取出当前选中Fragment的ID
val currentDrawerFragmentId = drawerNavController.currentDestination?.id

要是你的Drawer是用NavigationUI.setupWithNavController()和NavigationView绑定的,也可以直接通过NavigationView关联的NavController来拿,效果完全一样。

2. 拿到另一个导航图的当前选中Fragment ID

另一个导航图肯定也有自己对应的NavHostFragment(比如id是nav_host_main),用同样的逻辑就能拿到:

// 在Activity或父Fragment里获取这个导航的NavController
val mainNavHost = supportFragmentManager.findFragmentById(R.id.nav_host_main) as NavHostFragment
val mainNavController = mainNavHost.navController
// 取出当前选中Fragment的ID
val currentMainFragmentId = mainNavController.currentDestination?.id

几个要注意的点

  • 一定要等NavHostFragment初始化完成再调用这些代码!比如在Activity的onCreate()执行完之后,或者Fragment的onViewCreated()方法里,不然很可能拿到null。
  • 如果是在Fragment里调用,记得把supportFragmentManager换成childFragmentManager——具体用哪个取决于你的NavHostFragment是放在Activity里还是父Fragment里。
  • currentDestination本身可能为null(比如导航图还没加载好的时候),所以用的时候最好做个非空判断,比如用?.let来处理:
currentDrawerFragmentId?.let { fragmentId ->
    // 这里可以根据ID判断当前是哪个Fragment,比如:
    when(fragmentId) {
        R.id.drawer_home_fragment -> // 执行对应的逻辑
        R.id.drawer_settings_fragment -> // 执行对应的逻辑
    }
}

这样就能轻松拿到两个导航图里当前活跃的Fragment ID啦!

内容的提问来源于stack exchange,提问作者Ashok Songara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:58:49