首页 > 解决方案 > 使用 Navigation 组件通过 App Bar/Toolbar 打开 Fragments

问题描述

我实现了一个底部导航视图,它还使用谷歌自己的解决方法来处理多个 backstacks,如架构组件示例中给出的,使用文件

private fun setupBottomNavigationBar() {
        val navGraphIds = listOf(
            R.navigation.blog,
            R.navigation.events,
            R.navigation.practice,
            R.navigation.login
        )

        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_nav)
        val controller = bottomNavigationView.setupWithNavController(
            navGraphIds = navGraphIds,
            fragmentManager = supportFragmentManager,
            containerId = R.id.fragment,
            intent = intent
        )

        //use this to setup Action bar

        controller.observe(this) { navController ->
            setupActionBarWithNavController(navController)
        }
        currentNavController = controller
    }

这就是我设置底部导航视图的方式。我有一个应该打开设置片段的应用栏,但到目前为止我一直无法这样做。有什么解决办法吗?这就是选择选项的样子

override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            R.id.settings -> TODO()//->should open settings fragment
        }
        return true
    }

我无法直接导航到设置,因为当前架构有多个导航图,因此它说,

java.lang.IllegalArgumentException: Navigation action/destination com.istemanipal.lumos:id/themeFragment cannot be found from the current destination Destination(com.istemanipal.lumos:id/blogFragment

标签: androidkotlinandroid-architecture-componentsandroid-navigation

解决方案


如果菜单项的 id 设置为片段 id,您可能可以使用导航控制器来切换目的地。

override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            R.id.settings -> currentNavController.navigate(R.id.navigation_destination_id)
        }
        return true
    }

推荐阅读