【问题标题】:How do we handle bottom menu nav items clicks only when bottom menu items are clicked and still use setupWithNavController?只有当底部菜单项被点击并且仍然使用 setupWithNavController 时,我们如何处理底部菜单导航项点击?
【发布时间】:2021-08-03 11:31:18
【问题描述】:

我们如何仅在单击底部菜单项并且仍使用 setupWithNavController 时跟踪底部菜单导航项的单击? 目前使用底部导航视图 2.4.0-alpha05,我们有一个用于跟踪底部导航点击以进行分析的用例,底部导航设置如下

binding.bottomNavigationView.setupWithNavController(navController)

如果我在下面使用,那么底部导航选择将停止工作。

binding.bottomNavigationView.setOnItemSelectedListener { 
        //track clicks
        true
    } 

复制源代码NavigationUi.setupWithNavController 并像下面这样更改它的替代方法,但是我不确定这是否会产生影响,例如,如果谷歌添加改进或稍后更改 setupWithNavController,那么项目将错过该更改:

    private fun setupWithNavController(
        navigationBarView: NavigationBarView,
        navController: NavController,
        onItemSelected: ((Int) -> Unit)
    ) {
        navigationBarView.setOnItemSelectedListener { item ->
            onItemSelected.invoke(item.itemId)
            NavigationUI.onNavDestinationSelected(
                item,
                navController
            )
        }
        val weakReference = WeakReference(navigationBarView)
        navController.addOnDestinationChangedListener(
            object : NavController.OnDestinationChangedListener {
                override fun onDestinationChanged(
                    controller: NavController,
                    destination: NavDestination,
                    arguments: Bundle?
                ) {
                    val view = weakReference.get()
                    if (view == null) {
                        navController.removeOnDestinationChangedListener(this)
                        return
                    }
                    view.menu.forEach { item ->
                        if (destination.matchDestination(item.itemId)) {
                            item.isChecked = true
                        }
                    }
                }
            })
    }

【问题讨论】:

标签: android android-jetpack android-architecture-navigation android-jetpack-navigation


【解决方案1】:

您可以从 BottomNavigationView 获取 MenuItem:

bottomNavigationView?.menu?.findItem(R.id.your_menu_item_id) // by menu item id

bottomNavigationView?.menu?.get(index) // by index

获得 MenuItem 后,您可以点击 MenuItem 进行订阅:

bottomNavigationView?.menu?.findItem(R.id.your_menu_item_id)?.setOnMenuItemClickListener {
    // TODO: add your code
    return@setOnMenuItemClickListener false
}

NavigationComponent 运行良好,您可以处理对 BottomNavigationView 项目的点击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2019-01-25
    相关资源
    最近更新 更多