如何监听导航组件中的 Fragment Change?

How to listen to Fragment Change in Navigation Component?

如何在新的导航组件中添加 Fragment Change Listener?

我有一个 BottomNavigationView,其中我在 official sample

之后使用了新的导航组件

我的 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)
})

当片段在 4 个导航图中的任何一个发生变化时,我想在我的 MainActivity 中有一个监听器。

controller 仅在 BottomNavigationView 个目的地之间切换时有效。

你试过了吗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()
}

除了 marat 和 vlad 的答案,如果你在 Xml 中使用 FragmentContainer,你可以通过这个访问它的导航控制器:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment 
val navController = navHostFragment.navController

否则可能会遇到 acitivity 没有 navcontroller 的 IllegalStateException