BottomNavigationView OnNavigationItemSelectedListener不会触发

时间:2019-11-30 12:08:59

标签: android bottomnavigationview

我的BottomActivity中有此代码。

 private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
                Log.d("Navigation", "You are picking bottombar")
                supportActionBar?.title = "Navigation Feed"
                val dashboardFragment = DashboardFragment()
                openFragment(dashboardFragment)
                return@OnNavigationItemSelectedListener true
            }

            R.id.navigation_dashboard -> {
                val homeFragment = HomeFragment()
                openFragment(homeFragment)
                return@OnNavigationItemSelectedListener true
            }

            R.id.navigation_notifications -> {
                val notificationFragment = NotificationsFragment()
                openFragment(notificationFragment)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_bottom)
        val navView: BottomNavigationView = findViewById(R.id.nav_view)


        navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        val appBarConfiguration = AppBarConfiguration(setOf(
                R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications))
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)

    private fun openFragment(fragment: Fragment) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.container, fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }

它应该做的只是设置侦听器并打开我的片段,但事实并非如此。 我认为问题出在mOnNavigationItemSelectedListener中,因为 它甚至没有登录控制台。我的活动仅加载文本的第一个片段 这是主页片段,点击后底视图不起作用。我需要Kotlin语言的解决方案。

1 个答案:

答案 0 :(得分:1)

为使导航组件正常工作,实际上不需要BottomNavigationView.OnItemSelectedListener。在OnItemSelectedListener中,手动加载片段确实是 WRONG 行为。如果确实需要它,则应通过以下方式进行:

 bottomNav.setOnNavigationItemSelectedListener {
        // ...
        NavigationUI.onNavDestinationSelected(it, navController)
        // ...
    }

在menu_bottomnavigationview.xml中检查菜单项的ID。 检查导航图中的顶级片段的ID,即R.id.navigation_home,R.id.navigation_dashboard,R.id.navigation_notifications。 这些ID应为相同。这足以使导航控制器将正确的片段加载到NavHostFragment中。

此外,如果您编写BottomNavigationView.OnItemSelectedListener,那么您将覆盖默认行为。然后,导航控制器无法将正确的片段加载到NavHostFragment中。如果确实需要使用BottomNavigationView.OnItemSelectedListener,则应编写以下代码将片段加载到NavHostFragment中。

bottomNav.setOnNavigationItemSelectedListener {
        NavigationUI.onNavDestinationSelected(it, navController)
    }