这是来自 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)
异常是 Fragment 仍在 onViewCreated() 中间,在第一次访问 Fragment viewModel 之前发生了一些导航并更改了 navController 回溯。
我想最简单的方法是防止底部导航从一开始就点击得太快。
演示和堆栈跟踪
最佳答案
发现 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/