我的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语言的解决方案。
答案 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)
}