android 防止重复点击是一个非常常见的需求,每个人都有各自的点击事件的处理习惯,有的喜欢使用匿名内部类,有的activity、fragment、自定义View等继承点击事件然后在onClick()方法中根据id用switch实现各自View的点击事件。
我自己的习惯呢,就是用switch进行分发,统一在一个地方管理点击事件。之前增删改之类的操作都弹出确认对话框,所以不存在防止重复点击。但是近来产品经理觉得就删除给确认对话框就行了,其它的直接发请求就行了。
于是我需要在原来代码基础上迅速增加防止重复点击的功能。
我记得大概的防止重复点击有实现setOnTouchListener的,有实现setOnClickListener的,也有用静态工具方法的。
比如:
public abstract class OnClickEvent implements View.OnClickListener {
private static long lastTime;
public abstract void singleClick(View v);
private long delay;
public OnClickEvent(long delay) {
this.delay = delay;
}
@Override
public void onClick(View v) {
if (onMoreClick(v)) {
return;
}
singleClick(v);
}
public boolean onMoreClick(View v) {
boolean flag = false;
long time = System.currentTimeMillis() - lastTime;
if (time < delay) {
flag = true;
}
lastTime = System.currentTimeMillis();
return flag;
}
}
比如:
public class Utils {
private static final int MIN_CLICK_DELAY_TIME = 1000;
private static long lastClickTime;
public static boolean isFastClick() {
boolean flag = false;
long curClickTime = System.currentTimeMillis();
if ((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) {
flag = true;
}
lastClickTime = curClickTime;
return flag;
}
}
因为我代码中所有点击事件都统一实现onClick用switch根据id分发,所以要增加防止重复点击,实现接口的方式就不太现实了。所以我觉得才有静态工具的方式。
但是普通静态工具的方式,那个lastTime是全局的,这显然是不科学的,可以遇见连续点两个按钮的时候第二个按钮点点击事件会被当做重复点击给忽略掉,虽然这个问题不太容易被产品经理发现,但是我自己觉得还是不爽。于是我采用了下面这种静态工具方法:
private static boolean avoidRepeatClick(View view){
boolean flag = false;
long lastTime = view.getTag(-1)==null?0:(long)view.getTag(-1);
if (System.currentTimeMillis()-lastTime>1000){
flag = true;
}
view.setTag(-1,System.currentTimeMillis());
return flag;
}
用view的tag属性来保存自己的点击时机,代码更少,不会出现上述问题,只需要避免-1这个tag的key和其它冲突,不过重度使用view的tag属性时一般都会在String中定义id,冲突的可能性很小。