android 防止重复点击

  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,冲突的可能性很小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,565评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,752评论 0 17
  • 原文地址:http://www.android100.org/html/201606/06/241682.html...
    AFinalStone阅读 4,724评论 0 1
  • z=x+y的分布函数。 比喻为小明能吃一碗饭,小红能吃两碗饭。小明加起来能吃的饭就是z=x+y。 网关:比喻为你被...
    我是一个好人吗阅读 3,089评论 0 0
  • 001.运动前后注重拉伸。 用5-10分钟的时间进行拉伸,避免运动中受到伤害。运动后更应该拉伸,避免肌肉酸痛。 0...
    影子倒了阅读 2,895评论 2 2