Android防止按鈕過快點(diǎn)擊造成多次事件的解決方法
問題
onClick事件是Android開發(fā)中最常見的事件。比如,一個(gè)submitButton,功能是點(diǎn)擊之后會(huì)提交一個(gè)訂單,
則一般代碼如下,其中submitOrder()函數(shù)會(huì)跳轉(zhuǎn)到下一頁(yè)進(jìn)行處理 :
//代碼0
submitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
submitOrder();
}
});
正常情況下這段代碼是沒什么問題的,但是Android設(shè)備的機(jī)型性能等千差萬(wàn)別,如果碰到比較卡的手機(jī),則有可能出現(xiàn)submitOrder()函數(shù)跳轉(zhuǎn)頁(yè)面出現(xiàn)延遲的現(xiàn)象。碰到這種現(xiàn)象,則用戶就很有可能再次點(diǎn)擊一次,從而造成函數(shù)被調(diào)用兩次,出現(xiàn)重復(fù)訂單的BUG。
一般地,碰到這現(xiàn)象,首先就會(huì)想到的就是在點(diǎn)擊之后把submitButton設(shè)置為不可點(diǎn)擊:
//代碼1 submitButton.setClickable(false); //或者 submitButton.setEnabled(false); </code>
此方法也確實(shí)有效,不過如果submitOrder()方法沒有成功,需要再次提交訂單時(shí)又需要再重復(fù)把submitButton設(shè)置為可點(diǎn)擊狀態(tài)。如果類似的button比較多時(shí),就顯得比較麻煩、混亂。
方案
自定義一個(gè)NoDoubleClickListener,繼承自O(shè)nClickListener:
//代碼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設(shè)置點(diǎn)擊事件時(shí)用NoDoubleClickListener代替OnClickListener,并且實(shí)現(xiàn)方法onNoDoubleClick代替onClick即可,像這樣:
<span style="font-size:14px;"> //代碼3
submitButton.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onNoDoubleClick(View v) {
submitOrder();
}
}); </span>
原理
很簡(jiǎn)單,見代碼……
就是用onNoDoubleClick代替onClick處理具體的操作,在onClick方法中加一個(gè)判斷:在接收到點(diǎn)擊事件之后,先判斷一下時(shí)間,如果距離上次處理操作不足MIN_CLICK_DELAY_TIME,就忽視——即能防止誤操作的連續(xù)點(diǎn)擊導(dǎo)致重復(fù)事件。
MIN_CLICK_DELAY_TIME可調(diào)。
優(yōu)勢(shì)
好處是不用改變?cè)写a的邏輯,就只需要兩個(gè)替換:NoDoubleClickListener代替OnClickListener,onNoDoubleClick代替onClick。 代碼的結(jié)構(gòu)等都不需要做改變(**對(duì)比上面的代碼0跟代碼**3),不需要關(guān)心處理更改button的狀態(tài)這些額外判斷邏輯,只需要關(guān)注業(yè)務(wù)邏輯即可,簡(jiǎn)潔優(yōu)雅~
- Android自定義Notification添加點(diǎn)擊事件
- 用Kotlin實(shí)現(xiàn)Android點(diǎn)擊事件的方法
- Android 自定義按鈕點(diǎn)擊事件和長(zhǎng)按事件對(duì)比
- Android 中RecycleView實(shí)現(xiàn)item的點(diǎn)擊事件
- Android給TextView添加點(diǎn)擊事件的實(shí)現(xiàn)方法
- Android中RecyclerView點(diǎn)擊Item設(shè)置事件
- Android中父View和子view的點(diǎn)擊事件處理問題探討
- Android實(shí)現(xiàn)連續(xù)點(diǎn)擊多次事件的代碼詳解
相關(guān)文章
Android Doze模式下Alarm定時(shí)任務(wù)實(shí)現(xiàn)流程詳解
這篇文章主要介紹了Android Doze模式下Alarm定時(shí)任務(wù)實(shí)現(xiàn),Android的定時(shí)任務(wù)有兩種,一種是JavaAPI提供的Timer類,另一種就是使用Android的Alarm機(jī)制2022-11-11
Android高亮引導(dǎo)控件的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android高亮引導(dǎo)控件的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
Android通過Java sdk的方式接入OpenCv的方法
這篇文章主要介紹了Android通過Java sdk的方式接入OpenCv的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Android開發(fā)中Widget的生命周期實(shí)例分析
這篇文章主要介紹了Android開發(fā)中Widget的生命周期,結(jié)合實(shí)例形式分析了Android開發(fā)中Widget生命周期所涉及的常用方法與使用技巧,代碼備有詳盡的注釋便于理解,需要的朋友可以參考下2016-02-02
Android天氣預(yù)報(bào)app改進(jìn)版
這篇文章主要為大家詳細(xì)介紹了改進(jìn)版的Android天氣預(yù)報(bào)app,內(nèi)容更加充實(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07
Kotlin?LinearLayout與RelativeLayout布局使用詳解
Kotlin?的基本特性就先寫到這里,我們這個(gè)系列的定位是基礎(chǔ),也就是能用就好,夠用就好,我們不會(huì)舉太多的例子,但是這些都是最經(jīng)常用到的特性。從這節(jié)開始就是Kotlin和android?進(jìn)行結(jié)合,使用Kotlin進(jìn)行安卓應(yīng)用的開發(fā)了2022-12-12
Java4Android開發(fā)教程(一)JDK安裝與配置
本文是Android開發(fā)系列教程的第一篇,主要為大家?guī)淼氖情_發(fā)環(huán)境的準(zhǔn)備工作,JDK安裝與配置圖文教程,非常的詳細(xì),有需要的朋友可以參考下2014-10-10
Android實(shí)現(xiàn)帶頭像的用戶注冊(cè)頁(yè)面
這篇文章主要介紹了Android實(shí)現(xiàn)帶頭像的用戶注冊(cè)頁(yè)面的相關(guān)資料,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
Android 如何實(shí)現(xiàn)彈窗順序&優(yōu)先級(jí)控制
這篇文章主要介紹了Android 如何實(shí)現(xiàn)彈窗順序&優(yōu)先級(jí)控制,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03

