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)文章
使用Eclipse配置android開發(fā)環(huán)境教程
這篇文章主要介紹了使用Eclipse配置android開發(fā)環(huán)境教程,本文講解了下載需要用到的工具、下載完需要的工具之后開始安裝、讓Ecplise自動安裝Android開發(fā)插件(ADT- plugin)、配置Andiord SDK路徑、測試開發(fā)一個Android項目等內(nèi)容,需要的朋友可以參考下2015-04-04Android實現(xiàn)帶圖標(biāo)的列表對話框
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)帶圖標(biāo)的列表對話框,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12Android Room數(shù)據(jù)庫多表查詢的使用實例
這篇文章主要介紹了Android Room數(shù)據(jù)庫多表查詢的使用實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Android開發(fā)之Fragment懶加載的幾種方式及性能對比
這篇文章主要介紹了Android開發(fā)之Fragment懶加載的幾種方式及性能對比的相關(guān)資料,具體詳細(xì)介紹需要的小伙伴可以參考下面文章內(nèi)容2022-05-05Android使用Scrolling機制實現(xiàn)Tab吸頂效果
app 首頁中經(jīng)常要實現(xiàn)首頁頭卡共享,tab 吸頂,內(nèi)容區(qū)通過 ViewPager 切換的需求,以前往往是利用事件處理來完成,但是這些也有一定的弊端和滑動方面不如意的地方,本文我們利用NestedScrolling機制來實現(xiàn),感興趣的朋友可以參考下2024-01-01