Android Butterknife@OnClick-动作多次触发

Android Butterknife@OnClick-动作多次触发,android,butterknife,Android,Butterknife,如果我在短时间内多次单击某个按钮,有时会多次执行该操作(取决于单击速度),是否有方法通过使用集成到ButterKnife中的任何东西来防止这种情况 在谷歌上搜索该问题的解决方案后,我通过一篇SO帖子询问了同样的问题。之后,我试着在ButterKnife源代码上挖掘了一点,找到了名为DebouncingOnClickListener的类(主要关注这个类,因为类“布局”)类似于我在StackOverflow上找到的解决方案) 这门课上有一条评论说 单击一个按钮将禁用该帧的所有按钮 如果我理解正确,这

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

在谷歌上搜索该问题的解决方案后,我通过一篇SO帖子询问了同样的问题。之后,我试着在
ButterKnife
源代码上挖掘了一点,找到了名为
DebouncingOnClickListener
的类(主要关注这个类,因为类“布局”)类似于我在StackOverflow上找到的解决方案)

这门课上有一条评论说

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

如果我理解正确,这意味着我不能“垃圾邮件”点击我的按钮。但事实并非如此,因为如果我点击所说的按钮,我可以多次执行动作按钮


我在StackOverflow上找到的解决方案“修复”了我的问题,但我只是想知道ButterKnife(我前面提到的类的Appart)上是否有类似的解决方案,因为我不想在源代码中“手动”设置click侦听器,造成混乱对于几个按钮,请使用
@OnClick
,对于那些我并不关心是否有多次调用的按钮。

我使用您附带的解决方案。我将单击按钮的时间保存在变量上,并确保此时间等于或大于250ms。这工作很好,但我同意,如果能让ButterKnife控制它,它会自动定义你想要的点击之间的时间范围,那就太好了。 此选项也很好,因为不仅要确保一个按钮没有被多次单击,而且可以对同一活动中的每个按钮使用相同的变量


另一个选项是禁用单击的按钮,并在该按钮触发的操作完成后再次启用该按钮。
DebouncingOnClickListener
防止在一个帧中多次单击。这不是很长的延迟,只有几毫秒。正如你在评论中所读到的,Jake Wharton(作者)将此行为视为应用程序层的一部分,他不想将其添加到Butter Knife中

它只会在一帧上发出两次咔哒声。如果在两个单独的框架上单击两次,则这是应用程序层的责任。您可以通过在第一次单击时禁用按钮来修复此问题


或者您的应用程序或域实现了基于时间的去抖动(取决于您的用例)。

将以下类添加到您的项目中,然后重新构建您的项目,问题将得到解决

package butterknife.internal;
导入android.support.annotation.NonNull;
导入android.view.view;
公共抽象类DebouncingOnClickListener实现View.OnClickListener{
静态布尔启用=真;
public final String name=“MyDebouncingOnClickListener”;
private static final Runnable ENABLE_再次=new Runnable(){
@重写公共无效运行(){
启用=真;
}
};
@在单击(视图v)时覆盖公共最终作废{
如果(已启用){
启用=错误;
//v.post(再次启用);!!!修改后的代码在这里!!!!
v、 postDelayed(再次启用_,300);
doClick(v);
}
}
公开摘要无效文件(视图五);
@非空
@凌驾
公共字符串toString(){
返回super.toString();
}
}