Android如何防止多次點擊事件
問題描述
恐怕大家都會遇到這樣的問題,一個點擊事件多次觸發(fā),導(dǎo)致,同樣的內(nèi)容提交了多次,或者說彈出多個頁面...
onClick事件是Android開發(fā)中最常見的事件。比如,一個submitButton,功能是點擊之后會提交一個訂單,則一般代碼如下,其中submitOrder()函數(shù)會跳轉(zhuǎn)到下一頁進行處理 :
<code class="hljs" java=""> //代碼0
submitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
submitOrder();
}
}); </code>
正常情況下這段代碼是沒什么問題的,但是Android設(shè)備的機型性能等千差萬別,如果碰到比較卡的手機,則有可能出現(xiàn)submitOrder()函數(shù)跳轉(zhuǎn)頁面出現(xiàn)延遲的現(xiàn)象。碰到這種現(xiàn)象,則用戶就很有可能再次點擊一次,從而造成函數(shù)被調(diào)用兩次,出現(xiàn)重復(fù)訂單的BUG。
一般地,碰到這現(xiàn)象,首先就會想到的就是在點擊之后把submitButton設(shè)置為不可點擊:
<code class="hljs" cs=""> //代碼1 submitButton.setClickable(false); //或者 submitButton.setEnabled(false); </code>
此方法也確實有效,不過如果submitOrder()方法沒有成功,需要再次提交訂單時又需要再重復(fù)把submitButton設(shè)置為可點擊狀態(tài)。如果類似的button比較多時,就顯得比較麻煩、混亂。
方案
自定義一個NoDoubleClickListener,繼承自O(shè)nClickListener:
<code class="hljs" java=""> //代碼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);
}
}
}</code>
使用方法—— 給submitButton設(shè)置點擊事件時用NoDoubleClickListener代替OnClickListener,并且實現(xiàn)方法onNoDoubleClick代替onClick即可,像這樣:
<code class="hljs" java=""> //代碼3
submitButton.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onNoDoubleClick(View v) {
submitOrder();
}
}); </code>
原理:
很簡單,見代碼……
就是用onNoDoubleClick代替onClick處理具體的操作,在onClick方法中加一個判斷:在接收到點擊事件之后,先判斷一下時間,如果距離上次處理操作不足MIN_CLICK_DELAY_TIME,就忽視——即能防止誤操作的連續(xù)點擊導(dǎo)致重復(fù)事件。
MIN_CLICK_DELAY_TIME可調(diào)。
優(yōu)勢
好處是不用改變原有代碼的邏輯,就只需要兩個替換:NoDoubleClickListener代替OnClickListener,onNoDoubleClick代替onClick。 代碼的結(jié)構(gòu)等都不需要做改變(**對比上面的代碼0跟代碼**3),不需要關(guān)心處理更改button的狀態(tài)這些額外判斷邏輯,只需要關(guān)注業(yè)務(wù)邏輯即可,簡潔優(yōu)雅~
相關(guān)文章
Android開發(fā)之自帶下載器DownloadManager的使用示例代碼
本篇文章主要介紹了Android開發(fā)之自帶下載器DownloadManager的使用示例代碼,Android自帶的DownloadManager是一個很好的下載文件的工具,有興趣的可以了解一下。2017-03-03
Android 啟動模式FLAG_ACTIVITY_CLEAR_TOP案例詳解
這篇文章主要介紹了Android 啟動模式FLAG_ACTIVITY_CLEAR_TOP案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Android FTP服務(wù)器上傳文件攻略(代碼詳解)
這篇文章主要介紹了Android FTP服務(wù)器上傳文件攻略,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
Android中fragment與activity之間的交互(兩種實現(xiàn)方式)
本篇文章主要介紹了Android中fragment與activity之間的交互(兩種實現(xiàn)方式),相信對大家學(xué)習(xí)會有很好的幫助,需要的朋友一起來看下吧2016-12-12
Android Studio中導(dǎo)入JNI生成的.so庫的實現(xiàn)方法
這篇文章主要介紹了Android Studio中導(dǎo)入JNI生成的.so庫的實現(xiàn)方法的相關(guān)資料,這里不僅提供實現(xiàn)方案并提供了實現(xiàn)的方法,需要的朋友可以參考下2017-07-07
Android studio4.1更新后出現(xiàn)的問題詳解
這篇文章主要介紹了Android studio4.1更新后出現(xiàn)的問題詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

