1.自制点击工具类防连点
ClickUtils工具类
import android.view.View;
public class ClickUtils {
//只需要传进view和监听,即可完成此view防连点功能。
public static void fastClickChecked(View v, View.OnClickListener listener){
if(v==null)return;
v.setOnClickListener(v1 -> {
listener.onClick(v1);
v1.setClickable(false);
v.postDelayed(() -> {
v.setClickable(true);
}, 500);
});
}
}
ClickUtils的使用
//参数1,要防连点的view 参数2,点击此view要执行的OnClickListener
ClickUtils.fastClickChecked(tvHeadLevel,v->goGrowGrade());
注意:此调用方式使用时并没有比原有view.setOnClickListener方式更加复杂。他甚至以更简单的方式来实现了防快速点击的效果。
原理
此处我是通过代理原view的点击,在原来view点击时,我采用先把此view的clickable设置为false,然后通过view.postDelayed方法过500秒后再把它置为可以点击,这样就可以避免在小米华为手机上的连点时跳转页面的情况下连续跳转多个页面了。
写此工具类的一个原因
其实写此工具类一个最根本的原因是,在安卓系统的有些手机上,快速点击程序的一些view进行跳转时会造成打开两个目标view的情况。而关于程序放连点我们实践过多种方式。但是通过尝试,有些方法不是使用繁琐,就是增加其他成本。例如gradle插件的方式会增加编译成本,使我们build软件时运行缓慢。增加编译时常,又比如rxJava的方式使用起来感觉过于繁琐。需要我们写的代码量太多,或者说运用两次时间间隔的方式通过动态点击计算是否触发事件,这种方式又太过复杂。所以我自己运用clickable方式写了一个原理简单且使用方便的工具类。
2.利用点击辅助类进行时间判断实现防连点
ButtonClickHelper工具类
/**
* 防止按钮短时间重复点击工具类
*/
public class ButtonClickHelper {
private static long lastClickTime = 0;
private static final long DIFF = 1000;
private static int lastButtonId = -1;
/**
* 判断两次点击的间隔,如果小于1000,则认为是多次无效点击
*
* @return
*/
public static boolean isFastDoubleClick() {
return isFastDoubleClick(-1, DIFF);
}
/**
* 判断两次点击的间隔,如果小于1000,则认为是多次无效点击
*
* @return
*/
public static boolean isFastDoubleClick(int buttonId) {
return isFastDoubleClick(buttonId, DIFF);
}
/**
* 判断两次点击的间隔,如果小于diff,则认为是多次无效点击
*
* @param diff
* @return
*/
public static boolean isFastDoubleClick(int buttonId, long diff) {
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if (lastButtonId == buttonId && lastClickTime > 0 && timeD < diff) {
return true;
}
lastClickTime = time;
lastButtonId = buttonId;
return false;
}
}
ButtonClickHelper的使用
在onClick方法首行加入如下代码:
if (ButtonClickHelper.isFastDoubleClick()) {
return;
}
原理
本方法的核心是ButtonClickHelper,此工具类中,利用在点击时记录点击的viewId和时间来进行二次点击的判断,如果第二次点击在指定在指定间隔之内isFastDoubleClick方法则返回ture,从而view的onClick会掉方法会从开始就return掉,不执行后续操作。此工具类给我们提供两个重载的isFastDoubleClick方法使我们更加方便的使用。
两种方式的对比
个人认为第一种方式使用起来更加简单,就跟view本身设置点击监听一样。第一种方式只需要把view和监听传入对应的方法即可实现防连点操作。但是第一种方法有不可避免的缺陷,那就是必须传入要设置防连点操作的view才行。针对特殊情况下的防连点,例如webView的js回调中要打开新的activity进行的连点,第一种方式就无能为力了。此时我们需要采用第二种方式进行相应操作。所以建议大家针对不同情况使用不同的方法。