public abstract class NoDoubleClickListener implements View.OnClickListener {
public static final int MIN_CLICK_DELAY_TIME = 1000;
private long lastClickTime = 0;
@Override
public void onClick(View v) {
long currentTime = SystemClock.elapsedRealtime();
if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {
lastClickTime = currentTime;
onNoDoubleClick(v);
}
}
protected abstract void onNoDoubleClick(View view);
}
submitButton.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onNoDoubleClick(View v) {
submitOrder();
}
});
- 这段代码是不是很熟悉....
- 项目大了,一个个click的数手酸不酸...
- 能不能把
butterknife
,databanding
,rxbinding
,lambda表达式
,里的点击一并处理了...
- 在项目根目录下的build.gradle 添加
dependencies {
...
classpath 'com.github.susan:debounceclick-plugin:1.0.1'
...
}
- 部分项目中配置插件
// 在 apply plugin: 'com.android.application'
//或者 apply plugin: 'com.android.library'
apply plugin: 'com.github.susan.debounceclick'
DebounceClick {
includePackages = []
excludePackages = []
debug = true
}
-
includePackages(添加修改文件路径)/excludePackages(排除修改文件路径)
-
debug = true 显示编译过程中详细日志
一般如果文件中有内容就说明插件生效,
相反,如果没有内容,就说明没本插件没生效。
没生效时app运行和没接入之前一样。
如果发现没生效,欢迎跟给我提issue。:-D
在项目编译成功,并生成Mapping文件后,在Application项目下做全局设置
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
DebounceClickHandler.FROZEN_WINDOW_MILLIS = 700L;
}
考虑butterknife自带有DebouncingOnClickListener(但是不是通过毫秒判断的),
如果任然希望通过毫秒来判断事件点击,在includePackages添加如下内容。
apply plugin: 'com.github.susan.debounceclick'
DebounceClick {
includePackages = ['butterknife.internal.DebouncingOnClickListener']
excludePackages=[]
debug = true
}
如果项目gradle里android节点有声明jackOptions,将使得本插件失效。
android {
//不要这么写
// jackOptions {
// enabled true
// }
}
不用jackOptions也能lambda的解决方案,见demo.
-
rxbinding和butterknife一起使用时,操作和butterknife操作一致,
-
rxbinding单独使用时,includePackages添加如下内容。
apply plugin: 'com.github.susan.debounceclick'
DebounceClick {
//if your project contains rxbinding and without butterKnife
includePackages = ['com.jakewharton.rxbinding.view.ViewClickOnSubscribe']
excludePackages=[]
debug = true
}
databanding会引入的点击事件并非是View.OnClickListener -> onClick(View view)
的方法,所以本插件添加注解@DebounceClickExtra
专门处理方法不是onClick
的方法。
如上图所示onXXClick方
法会被处理,而没有注释的onwithoutClick
不会被处理。