android - 防止在 BottomNavigationView 中快速单击

标签 android kotlin android-architecture-navigation android-navigation android-jetpack-navigation

这是来自 How to prevent view double click 的扩展问题 ,但用于底部导航。尤其是使用 setupWithNavController() 设置的。

使用您自己的点击监听器并比较先前点击时间的常用方法不起作用,因为 Android NavigationUI 现在正在处理点击。

例如,我在 fragment 中设置了 BottomNavigationView:

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val navHostFragment = childFragmentManager.findFragmentById(R.id.content_nav_host) as NavHostFragment
        val navController = navHostFragment.findNavController()
        val bottomNavigationView = view.findViewById<BottomNavigationView>(R.id.bottom_navigation)
        bottomNavigationView.setupWithNavController(navController)
    }

如果 fragment 之间的交换太快,我会收到此错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.project, PID: 11136
    java.lang.IllegalArgumentException: No destination with ID 2131296272 is on the NavController's back stack. The current destination is Destination(com.example.project/page1) label=page1 class=com.example.project.features.main.page1.Page1Fragment
        at androidx.navigation.NavController.getBackStackEntry(NavController.java:1358)

enter image description here

异常是 Fragment 仍在 onViewCreated() 中间,在第一次访问 Fragment viewModel 之前发生了一些导航并更改了 navController 回溯。

我想最简单的方法是防止底部导航从一开始就点击得太快。

演示和堆栈跟踪

https://github.com/yatw/QuickSwapBottomNav

最佳答案

发现 Backstack 条目在导航成功时更新,并且由于快速点击不同的目的地,不知何故请求的目的地 ID 已经不再在 Backstack 条目中。

同意设置 throttle 可能有助于防止这些问题,但我认为需要使用手动方法,使用 setOnItemSelectedListener()

但无论如何,尝试使用问题中附加的项目进行重现。
而且,如果我这边不进行节流,就无法再使用手动方法进行复制

bottomNavigationView.setOnItemSelectedListener { menuItem ->
            when (menuItem.itemId) {
                R.id.fragment1NestGraph -> {
                    val navOptions = NavOptions.Builder()
                        .setPopUpTo(R.id.fragment1NestGraph, true)
                        .build()
                    navController.navigate(R.id.fragment1NestGraph, Bundle(), navOptions)
                }
                R.id.fragment2NestGraph -> {
                    val navOptions = NavOptions.Builder()
                        .setPopUpTo(R.id.fragment2NestGraph, true)
                        .build()
                    navController.navigate(R.id.fragment2NestGraph, Bundle(), navOptions)
                }
                ...etc
            }

            true
        }

关于android - 防止在 BottomNavigationView 中快速单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70042748/

相关文章:

android - 在 Android View 中动态加载级联问题

android - Jetpack Compose WebView 处理返回导航并转到上一页

kotlin - Kotlin 中的内部类继承

android - Android 导航组件中的目的地链接

android - 用导航组件导航替换 fragment 后, fragment 内的 ViewPager2 泄漏

android 屏幕尺寸,values-v11,values-v14

Android软键盘覆盖EditText字段

android - 挂起函数后不执行非挂起函数

android - nav_graph 中两个 fragment 之间的共享 View 模型

android - 将项目导入Android Studio