欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android防止按钮过快点击造成多次事件的解决方法

程序员文章站 2024-03-04 12:04:23
问题 onclick事件是android开发中最常见的事件。比如,一个submitbutton,功能是点击之后会提交一个订单, 则一般代码如下,其中submitor...

问题

onclick事件是android开发中最常见的事件。比如,一个submitbutton,功能是点击之后会提交一个订单,
则一般代码如下,其中submitorder()函数会跳转到下一页进行处理 :

//代码0 
submitbutton.setonclicklistener(new onclicklistener() { 
@override 
public void onclick(view v) { 
submitorder(); 
} 
}); 

正常情况下这段代码是没什么问题的,但是android设备的机型性能等千差万别,如果碰到比较卡的手机,则有可能出现submitorder()函数跳转页面出现延迟的现象。碰到这种现象,则用户就很有可能再次点击一次,从而造成函数被调用两次,出现重复订单的bug。

一般地,碰到这现象,首先就会想到的就是在点击之后把submitbutton设置为不可点击:

//代码1 
submitbutton.setclickable(false); 
//或者 
submitbutton.setenabled(false); </code> 

此方法也确实有效,不过如果submitorder()方法没有成功,需要再次提交订单时又需要再重复把submitbutton设置为可点击状态。如果类似的button比较多时,就显得比较麻烦、混乱。

方案

自定义一个nodoubleclicklistener,继承自onclicklistener:

//代码2 
public abstract class nodoubleclicklistener implements onclicklistener { 
public static final int min_click_delay_time = 1000; 
private long lastclicktime = 0; 
@override 
public void onclick(view v) { 
long currenttime = calendar.getinstance().gettimeinmillis(); 
if (currenttime - lastclicktime > min_click_delay_time) { 
lastclicktime = currenttime; 
onnodoubleclick(v); 
} 
} 
} 

使用方法—— 给submitbutton设置点击事件时用nodoubleclicklistener代替onclicklistener,并且实现方法onnodoubleclick代替onclick即可,像这样:

<span style="font-size:14px;"> //代码3 
submitbutton.setonclicklistener(new nodoubleclicklistener() { 
@override 
public void onnodoubleclick(view v) { 
submitorder(); 
} 
}); </span> 

原理

很简单,见代码……

就是用onnodoubleclick代替onclick处理具体的操作,在onclick方法中加一个判断:在接收到点击事件之后,先判断一下时间,如果距离上次处理操作不足min_click_delay_time,就忽视——即能防止误操作的连续点击导致重复事件。

min_click_delay_time可调。

优势

好处是不用改变原有代码的逻辑,就只需要两个替换:nodoubleclicklistener代替onclicklistener,onnodoubleclick代替onclick。 代码的结构等都不需要做改变(**对比上面的代码0跟代码**3),不需要关心处理更改button的状态这些额外判断逻辑,只需要关注业务逻辑即可,简洁优雅~