如何在导航组件中监听片段变化?

26

如何在新的导航组件中添加Fragment变化监听器?

我有一个BottomNavigationView,其中我使用了新的导航组件,参考官方示例

我有四个目的地在我的BottomNavigationView中,它们都有自己的导航图。

val navGraphIds = listOf(R.navigation.nav_home, R.navigation.nav_discover, R.navigation.nav_search, R.navigation.nav_my)

val controller = bottom_nav.setupWithNavController(
    navGraphIds = navGraphIds,
    fragmentManager = supportFragmentManager,
    containerId = R.id.navHostContainer,
    intent = intent
)

controller.observe(this, Observer { navController ->
    setupActionBarWithNavController(navController)
})

我希望我的MainActivity中有一个监听器,当任何4个导航图中的片段发生变化时,都能够被监听到。
只有在切换BottomNavigationView目标时,controller才会起作用。
2个回答

60

你尝试过使用 NavController.OnDestinationChangedListener 吗?

private lateinit var controller: NavController // don't forget to initialize

private val listener = NavController.OnDestinationChangedListener { controller, destination, arguments ->
    // react on change
    // you can check destination.id or destination.label and act based on that
}

override fun onResume() {
    super.onResume()
    controller.addOnDestinationChangedListener(listener)
}

override fun onPause() {
    controller.removeOnDestinationChangedListener(listener)
    super.onPause()
}

6
请勿忘记初始化-->部分将为navController = Navigation.findNavController(this, R.id.nav_host_fragment),其中nav_host_fragment是包含 app:navGraph="@navigation/mobile_navigation" 的碎片。 - Rahul Kahale
1
它必须被添加和删除吗?为什么不能只在onCreate中添加并保留在那里? - behelit
我有一个问题:在 onDestroy() 中,监听器也应该被移除吗?类似这样:override fun onDestroy() { controller.removeOnDestinationChangedListener(listener) super.onDestroy() } - A. Cedano

1
除了Marat和Vlad的答案之外,如果您在XML中使用FragmentContainer,则可以通过以下方式访问其导航控制器:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment 
val navController = navHostFragment.navController

否则可能会遇到活动没有NavController的IllegalStateException。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接