Android开发教程之如何屏蔽View的重复点击
作者:goweii 发布时间:2021-05-27 10:06:56
前言
android 防止重复点击是一个非常常见的需求,每个人都有各自的点击事件的处理习惯,有的喜欢使用匿名内部类,有的activity、fragment、自定义View等继承点击事件然后在onClick()方法中根据id用switch实现各自View的点击事件。
在开发中我们经常需要这样的需求,比如一个验证码发送按钮,我们只想让它响应500毫秒中的第一次点击事件,该如何处理呢?你可能会说这个简单,在点击事件中获取当前时间与上次的比较下,如果小于500毫秒就return掉。是的,这样可以解决,但是如果现在整个项目的所有按钮点击事件都需要这样的需求,该如何处理?不可能内个点击事件中都加入这几行代码吧。
这里先放上我写的一个响应第一次点击的工具类,可实现2种模式:
第一种:无论点击的哪个View,仅响应第一次点击
第二章:同一个View上仅响应第一次点击,不同View间无影响
public class ClickHelper {
private static long DELAY = 500L;
private static long lastTime = 0L;
private static List<Integer> viewIds = null;
private static final int SAME_VIEW_SIZE = 10;
private ClickHelper() {
}
public static void setDelay(long delay) {
ClickHelper.DELAY = delay;
}
public static long getDelay() {
return DELAY;
}
public static void onlyFirstIgnoreView(final View target, @NonNull final Callback callback) {
long nowTime = System.currentTimeMillis();
if (nowTime - lastTime > DELAY) {
callback.onClick(target);
lastTime = nowTime;
}
}
public static void onlyFirstSameView(final View target, @NonNull final Callback callback) {
long nowTime = System.currentTimeMillis();
int id = target.getId();
if (viewIds == null) {
viewIds = new ArrayList<>(SAME_VIEW_SIZE);
}
if (viewIds.contains(id)) {
if (nowTime - lastTime > DELAY) {
callback.onClick(target);
lastTime = nowTime;
}
} else {
if (viewIds.size() >= SAME_VIEW_SIZE) {
viewIds.remove(0);
}
viewIds.add(id);
callback.onClick(target);
lastTime = nowTime;
}
}
public interface Callback {
void onClick(View view);
}
}
那如何才能让它对整个项目的所有点击事件生效呢?我的解决办法是这样的。
第一步,继承View.OnClickListener在onClick方法中调用工具类回调到抽象方法,项目中所有的点击事件都去继承这个抽象类
public abstract class OnFirstClickListener implements View.OnClickListener {
@Override
public final void onClick(final View v) {
ClickHelper.onlyFirstSameView(v, new ClickHelper.Callback() {
@Override
public void onClick(View view) {
onFirstClick(view);
}
});
}
public abstract void onFirstClick(View v);
}
第二步,在项目的BaseActivity中实现View.OnClickListener接口,在onClick方法中调用工具类,回调出屏蔽后的点击事件,子类复写onClickWithoutLogin或者onClickCheckLogin方法就可以了。至于为什么会有2个,看名字就知道了,一个验证了用户登录状态,仅在登录状态响应事件,未登录则跳转登录界面,多封装了一层罢了。
/**
* 用注解绑定点击事件时,在该方法绑定
*/
@Override
public void onClick(final View v) {
ClickHelper.onlyFirstSameView(v, new ClickHelper.Callback() {
@Override
public void onClick(View view) {
if (!onClickWithoutLogin(view)) {
if (UserUtils.doIfLogin(getContext())) {
onClickCheckLogin(view);
}
}
}
});
}
/**
* 不需要登录的点击事件
*/
public boolean onClickWithoutLogin(View v) {
return false;
}
/**
* 必须登录的点击事件
* 如果已经登录直接执行,没有登录时跳转登录界面
*/
public void onClickCheckLogin(View v) {
}
以上只是个人开发中用到的,如果大家有更好的方法,欢迎留言讨论。
来源:http://www.jianshu.com/p/f2610851b260


猜你喜欢
- 目录简介为什么使用protobuf定义.proto文件编译协议文件详解生成的文件Builders 和 Messages序列化和反序列化协议扩
- 阅读收获理解SpringBoot自动配置原理一、SpringBoot是什么SpringBoot 的诞生就是为了简化 Spring 中繁琐的
- 本文实例讲述了Android开发使用URLConnection进行网络编程。分享给大家供大家参考,具体如下:URL的openConnecti
- SSM在Controller中添加事务管理本人使用:集成开发环境:idea项目管理工具:maven数据库:oracle框架:Spring+S
- GoogleNow是Android4.1全新推出的一款应用他,它可以全面了解你的使用习惯,并为你提供现在或者未来可能用到的各种信息,Goog
- 主要注意的是在资源引用的地方AlertDialog.Builder(this,R.style.dialogNoBg).create();这里
- 前言在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,例如使用devtool来实现
- 前言上一篇我们介绍了使用 sqflite 这个数据库工具在 Flutter 的应用中建立本地数据库的实例应用。了解过数据库的同学应该会知道,
- 本文实例为大家分享了Swing实现可动态刷新的验证码的具体代码,供大家参考,具体内容如下不多,code代码如下:import java.aw
- 本文实例讲述了Android通过json向MySQL中写入数据的方法。分享给大家供大家参考,具体如下:先说一下如何通过json将Androi
- 本篇文章主要记录一下Android中打开Wifi、获取Wifi接入点信息及连接指接入点的方法。自己写的demo主要用于测试接口的基本功能,因
- 本文实例为大家分享了springboot+vue实现垃圾分类管理系统的具体代码,供大家参考,具体内容如下一、项目概述1.项目内容本项目利用I
- JAVA是面向对象的语言,开发者在操作数据的时候,通常更习惯面对一个特定类型的对象,如一个用户就是一个User类的对象。DAO层需要做的,就
- redis redisson 集合操作相关类及接口Rlist:链表public interface RList<V> exten
- Spring是什么?我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃
- 在阿里开发手册的建表规约中有说明,数据库表中应该都要有create_time、update_time字段;那么在开发中,对于这些共有字段的处
- 基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍
- 创建maven web项目有两种方式,一种是使用骨架方式,一种是不使用骨架的方式创建方式一、使用骨架的方式1.打开idea,按照步骤创建一个
- 前言前面几篇我们简单的复习了一下自定义 View 的测量与绘制,并且回顾了常见的一些事件的处理方式。那么如果我们想自定义 ViewGroup
- 本文为大家分享了java微信公众号企业付款的开发代码,供大家参考,具体内容如下详情参照微信开发者文档 企业付款文档 java代码