Android防止按钮重复点击示例代码
作者:一片枫叶_刘超 发布时间:2023-10-11 18:15:24
本文中我将介绍一下我自己封装的一个小的工具类库:按钮点击事件类库。
作用:该类库可以防止按钮重复点击,可以判断网络状态,可以判断用户登录状态,以及自定义验证条件等等。
说明:其实现的核心原理就是通过自定义实现自身的OnClickListener类,并重写其中的onClick方法,在onClick方法中执行相应的判断逻辑之后回调我们自定义的抽象方法。
具体效果如下图所示:
使用方式
屏蔽多次点击事件
/**
* 测试快速点击事件
*/
fastButton.setOnClickListener(new OnClickFastListener() {
/**
* 自定义实现的抽象方法,不在重写onClick方法,该方法用于执行点击后的逻辑
*/
@Override
public void onFastClick(View v) {
Toast.makeText(mContext, "您点击了测试网络按钮...", Toast.LENGTH_LONG).show();
}
});
这里的fastButton就是一个普通的按钮组件,然后我们为该组件设置了点击事件,并且传入的是我们自定义的OnClickListener类(这里需要说明的是,不只是button组件任何View组件的点击事件都是可以的,这里只是以Button组件为例子),这里默认的屏蔽多次点击事件的时间间隔为900ms,也就是说当我们为组件设置了我们自定义的点击事件监听之后,假如有两次点击事件,并且第二次点击时若距离第一次点击事件小于0.9s,则第二次点击不会起作用;
屏蔽网络情况
/**
* 测试网络状况
*/
networkButton.setOnClickListener(new OnClickNetworkListener() {
/**
* 自定义实现的抽象方法,主要用于执行有网络之后的逻辑
*/
@Override
public void onNetworkClick(View v) {
Toast.makeText(mContext, "当前设备有网络,执行后续操作...", Toast.LENGTH_LONG).show();
}
/**
* 自定义实现的抽象方法,主要用于执行当前设备没有网络之后的逻辑
*/
@Override
public void onNoNetworkClick(View v) {
Toast.makeText(mContext, "当前设备没有网络...", Toast.LENGTH_LONG).show();
}
});
同样的,这里的networkButton也是我们自定义的一个按钮组件,我们为其设置了点击事件监听,并传入了我们自定义的OnNetworkClickListener类,可以发现OnNetworkClickListener类中有两个回调方法,其中onNetworkClick方法用于执行当前设备有网的情况,而onNoNetworkClick方法用于处理当前设备没有网络的后续操作;
屏蔽是否登录情况
/**
* 测试是否登陆
*/
loginButton.setOnClickListener(new OnClickLoginedListener(mContext) {
/**
* 自定义实现的抽象方法,用于判断当前设备是否登录
*/
@Override
public boolean isLogined(Activity context, View view) {
return false;
}
/**
* 主要用于执行判断用户登录之后执行的逻辑
*/
@Override
public void onLoginedClick(View v) {
Toast.makeText(mContext, "设备已登录,之后后续操作...", Toast.LENGTH_LONG).show();
}
/**
* 主要用于执行判断用户未登录之后执行的逻辑
*/
@Override
public void onNoLoginedClick(View v) {
Toast.makeText(mContext, "设备未登陆,无法执行后续操作...", Toast.LENGTH_LONG).show();
}
});
这里的loginButton同样是我们自定义的一个按钮组件,并为其设置了我们的OnLoginedClickListener类,然后其中有三个回调方法,
其中方法isLogined用于判断当前用户是否登录,返回为true则表示用户已经登录,返回为false则表示用户未登录,具体实现逻辑需要在业务层实现,方法onLoginedClick用于执行登录之后的逻辑,而方法onNoLoginedClick用于执行用户尚未登录的逻辑。
这就是这个类库大概的实现功能,说完功能之后我们来看一下其具体实现逻辑:
实现方式
上面我们讲解了该类库的使用方式,那么我们是如何实现的呢?下面我们看一下该类库的源代码。
防止按钮重复点击
/**
* 方法按钮重复点击的监听类源码
*/
public abstract class OnClickFastListener extends BaseClickListener {
// 防止快速点击默认等待时长为900ms
private long DELAY_TIME = 900;
private static long lastClickTime;
private boolean isFastDoubleClick() {
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if (0 < timeD && timeD < DELAY_TIME) {
return true;
}
lastClickTime = time;
return false;
}
@Override
public void onClick(View v) {
// 判断当前点击事件与前一次点击事件时间间隔是否小于阙值
if (isFastDoubleClick()) {
return;
}
onFastClick(v);
}
/**
* 设置默认快速点击事件时间间隔
* @param delay_time
* @return
*/
public OnClickFastListener setLastClickTime(long delay_time) {
this.DELAY_TIME = delay_time;
return this;
}
/**
* 快速点击事件回调方法
* @param v
*/
public abstract void onFastClick(View v);
}
按钮点击监听网络状况
/**
* 判断当前设备是否有网络的监听类源码
*/
public abstract class OnClickNetworkListener extends BaseClickListener {
@Override
public void onClick(View v) {
boolean isNetworkOk = isNetworkConnected(v.getContext());
if (isNetworkOk) {
onNetworkClick(v);
} else {
onNoNetworkClick(v);
}
}
// 点击事件--有网络
public abstract void onNetworkClick(View v);
// 点击事件--没有网络
public abstract void onNoNetworkClick(View v);
/**
* 网络连接是否正常
*
* @param context
* @return
*/
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
}
和刚刚的防止按钮重复点击事件类似,这里也是重写了自己的OnClickListener对象,然后重写了其onClick方法,并在其中执行isNetworkConnected方法,该方法就是判断是否当前设备是否有网络,若有网络则执行onNetworkClick方法,若无网络则执行onNoNetworkClick方法,这样当我们为自己的View组件设置点击事件的时候只需要为View组件设置onClickListener为我们自定义的OnClickListener对象,然后重写其中的onNetworkClick和onNoNetworkClick方法,其中onNetworkClick方法为有网络的回调方法,而onNoNetworkClick方法为无网络的回调方法。
按钮点击监听是否登录
/**
* 判断当前App用户是否登录的监听源码
*/
public abstract class OnClickLoginedListener extends BaseClickListener {
private Activity context = null;
public OnClickLoginedListener(Activity context) {
this.context = context;
}
@Override
public void onClick(View view) {
super.onClick(view);
if (isLogined(context, view)) {
onLoginedClick(view);
} else {
onNoLoginedClick(view);
}
}
/**
* 判断当前用户是否登录
* @param context
* @param view
* @return
*/
public abstract boolean isLogined(Activity context, View view);
/**
* 用户登录之后执行的逻辑
* @param v
*/
public abstract void onLoginedClick(View v);
/**
* 用户未登录执行点击事件
*/
public abstract void onNoLoginedClick(View v);
}
这里也是通过定义自身的OnClickListener类,然后重写其中的onClick方法,并在其中执行isLogined方法,该方法用于返回用户是否登录的逻辑判断,并且也是一个抽象的方法,所以也需要我们在业务层实现其具体的逻辑,然后我们重写了其中的onLoginedClick方法和onNoLoginedClick方法,其中onLoginedClick方法为用户登录之后的回调方法,而onNoLoginedClick方法为用户未登录之后执行的回调方法。
定制化执行相应的业务逻辑
/**
* 执行定制化判断逻辑的监听类源码
*/
public abstract class OnClickCostomListener extends BaseClickListener {
@Override
public void onClick(View view) {
super.onClick(view);
if (isCorrect()) {
onCorrentClick(view);
} else {
onNoCorrentClick(view);
}
}
/**
* 判断是否逻辑通过
* @return
*/
public abstract boolean isCorrect();
/**
* 判断正确之后执行的逻辑请求
* @param v
*/
public abstract void onCorrentClick(View v);
/**
* 判断失败之后执行的逻辑请求
* @param v
*/
public abstract void onNoCorrentClick(View v);
}
可以看到这里重新定义了一个OnClickListener类,然后重写其中的onClick方法,首先执行判断方法isCorrect,然后若判断通过则执行onCorrentClick方法,若判断未通过则执行onNoCorrentClick方法。
这样我们就大概的分析了防止按钮重复点击类库的主要实现逻辑与功能,源码很简单,以后我会不断的开源与更新一些好用的类库的,希望大家多多支持。
总结:
该类库主要是通过自定义OnClickListener类,并重写其中的onClick方法实现的;
通过设置回调方法为抽象方法保证了我们必须要重写相应的回调方法;
项目保存地址:Android-repeatclick,欢迎star和follow
来源:https://blog.csdn.net/qq_23547831/article/details/51730472


猜你喜欢
- 前言最近在学习网络原理,突然萌发出自己实现一个网络服务器的想法,并且由于第三代小白机器人的开发需要,我把之前使用python、PHP写的那部
- 这篇文章主要介绍了Maven打包jar生成javadoc文件和source文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作
- 快速排序快速排序是一种比较高效的排序算法,采用“分而治之”的思想,通过多次比较和交换来实现排序,在一
- IDEA SpringBoot项目配置热更新的步骤1.在pom.xml中添加依赖:<dependency><groupId
- C语言 strcmp() 函数用于对两个字符串进行比较(区分大小写)。头文件:string.h语法/原型:int strcmp(const
- java的Console类的使用方法及实例JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备。如果你的Java
- 首先:因为工作需要,需要对接socket.io框架对接,所以目前只能使用netty-socketio。websocket是不支持对接sock
- DSL的作用是解决领域专家与软件开发人员之间的沟通问题。听起来很唬人,其实不是什么高深的东西,我们可以使用Fluent API 创建自己的D
- 下面给大家介绍几种比较常见的解决办法,具体内容如下:1.有时候eclipse不自动编译,把project clean一下,让R.java重新
- 一、依赖注入方式思考:向一个类中传递数据的方式有几种?普通方法(set方法)构造方法思考:依赖注入描述了在容器中建立bean与bean之间依
- 前言SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少。新手代码审计者往往对J
- 什么是RESTful APIRESTful API是一种基于HTTP协议的Web API,它的设计原则是简单、可扩展、轻量级、可缓存、可靠、
- 本文实例为大家分享了unity实现玻璃效果的具体代码,供大家参考,具体内容如下一、使用Cubemap,做一个假反射shader代码如下:Sh
- Maven,是一个Java开发比较常用的项目管理工具,可以对 Java 项目进行构建、依赖管理。对于很多Java程序员来说,分层架构都是不陌
- 这篇文章主要介绍了深入了解JVM字节码增强技术,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 解决方法:maven的配置文件<mirror> <id>aliyunmaven</id> <mir
- 我们在学习接口的时候。能够在里面做一些方法的调用。不过今天所要讲的JDBC,虽然也是连接数据库的一种接口,不过与类接口有着很大的区别,大家要
- 从大学就开始做C#这块,也做C#几年了,最近又从ios转回.Net,继续做C#,之前也没有写博客的习惯,写博客也是从我做ios的时候开始的,
- C#是一门支持多线程的语言,因此线程的使用也是比较常见的。由于线程的知识在Win32编程的时候已经说得过多,所以在.Net中很少介绍这部分(
- Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,