Butterknife @OnClick-动作已多次触发

时间:2019-01-24 13:31:49

标签: android butterknife

如果我在短时间内多次单击某个按钮,有时该动作将执行多次(取决于单击速度),是否可以通过使用ButterKnife中集成的任何方法来防止这种情况发生?

在google上搜索该问题的解决方案后,我遇到了一个SO帖子,问同样的https://stackoverflow.com/a/38525054/7575454,然后我尝试在ButterKnife源代码中进行一些挖掘,找到了该类名为DebouncingOnClickListener(大多数情况下都在此类上看,因为类“ layout”类似于我在StackOverflow上找到的解决方案)。

该课上有一段评论

  

单击一个按钮将禁用该帧的所有按钮

如果我理解正确,则意味着我不应该“垃圾邮件”单击我的按钮。但事实并非如此,因为如果我点击垃圾邮件按钮,则可以多次执行操作按钮。

我在StackOverflow上找到的解决方案“解决了”我的问题,但我只是想知道ButterKnife(我刚才说的班级是Appart)上是否还有与此类似的东西,因为我真的不想搞乱在我的源代码中,将“点击侦听器”“手动”设置为几个按钮,并在我真的不在乎的按钮上使用@OnClick

3 个答案:

答案 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">