如果我在短时间内多次单击某个按钮,有时该动作将执行多次(取决于单击速度),是否可以通过使用ButterKnife
中集成的任何方法来防止这种情况发生?
在google上搜索该问题的解决方案后,我遇到了一个SO帖子,问同样的https://stackoverflow.com/a/38525054/7575454,然后我尝试在ButterKnife
源代码中进行一些挖掘,找到了该类名为DebouncingOnClickListener
(大多数情况下都在此类上看,因为类“ layout”类似于我在StackOverflow上找到的解决方案)。
该课上有一段评论
单击一个按钮将禁用该帧的所有按钮
如果我理解正确,则意味着我不应该“垃圾邮件”单击我的按钮。但事实并非如此,因为如果我点击垃圾邮件按钮,则可以多次执行操作按钮。
我在StackOverflow上找到的解决方案“解决了”我的问题,但我只是想知道ButterKnife(我刚才说的班级是Appart)上是否还有与此类似的东西,因为我真的不想搞乱在我的源代码中,将“点击侦听器”“手动”设置为几个按钮,并在我真的不在乎的按钮上使用@OnClick
。
答案 0 :(得分:4)
DebouncingOnClickListener
可防止在一帧中多次单击。延迟时间不长,只有几毫秒。正如您对issue的评论一样,作者Jake Wharton(作者)将这种行为视为应用程序层的一部分,他不想将其添加到黄油刀中。
它只消除一帧中的两次单击。如果您在两个单独的框架上单击两次,则应由应用程序层来处理。您可以通过在第一次点击时禁用按钮来解决此问题。
或者您让您的应用程序或域实现基于时间的去抖动(取决于用例)。
答案 1 :(得分:0)
我使用您随附的解决方案。我将单击按钮的时间保存在变量中,并确保该时间等于或大于250ms。效果很好,但我同意让ButterKnife控制自动定义您希望两次点击之间的时间范围会很好。 此选项还不错,因为不仅可以确保未多次单击一个按钮,而且可以对同一活动中的每个按钮使用相同的变量。
另一种选择是禁用单击的按钮,并在此按钮触发的操作完成后再次启用它。
答案 2 :(得分:0)
将以下类添加到您的项目中,然后重建您的项目,该问题将得到解决。
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/graph1c"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="1dp"
android:layout_marginTop="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textViewreccom">