Android開發(fā)教程之如何屏蔽View的重復(fù)點(diǎn)擊
前言
android 防止重復(fù)點(diǎn)擊是一個(gè)非常常見的需求,每個(gè)人都有各自的點(diǎn)擊事件的處理習(xí)慣,有的喜歡使用匿名內(nèi)部類,有的activity、fragment、自定義View等繼承點(diǎn)擊事件然后在onClick()方法中根據(jù)id用switch實(shí)現(xiàn)各自View的點(diǎn)擊事件。
在開發(fā)中我們經(jīng)常需要這樣的需求,比如一個(gè)驗(yàn)證碼發(fā)送按鈕,我們只想讓它響應(yīng)500毫秒中的第一次點(diǎn)擊事件,該如何處理呢?你可能會(huì)說這個(gè)簡單,在點(diǎn)擊事件中獲取當(dāng)前時(shí)間與上次的比較下,如果小于500毫秒就return掉。是的,這樣可以解決,但是如果現(xiàn)在整個(gè)項(xiàng)目的所有按鈕點(diǎn)擊事件都需要這樣的需求,該如何處理?不可能內(nèi)個(gè)點(diǎn)擊事件中都加入這幾行代碼吧。
這里先放上我寫的一個(gè)響應(yīng)第一次點(diǎn)擊的工具類,可實(shí)現(xiàn)2種模式:
- 第一種:無論點(diǎn)擊的哪個(gè)View,僅響應(yīng)第一次點(diǎn)擊
- 第二章:同一個(gè)View上僅響應(yīng)第一次點(diǎn)擊,不同View間無影響
public class ClickHelper { private static long DELAY = 500L; private static long lastTime = 0L; private static List<Integer> viewIds = null; private static final int SAME_VIEW_SIZE = 10; private ClickHelper() { } public static void setDelay(long delay) { ClickHelper.DELAY = delay; } public static long getDelay() { return DELAY; } public static void onlyFirstIgnoreView(final View target, @NonNull final Callback callback) { long nowTime = System.currentTimeMillis(); if (nowTime - lastTime > DELAY) { callback.onClick(target); lastTime = nowTime; } } public static void onlyFirstSameView(final View target, @NonNull final Callback callback) { long nowTime = System.currentTimeMillis(); int id = target.getId(); if (viewIds == null) { viewIds = new ArrayList<>(SAME_VIEW_SIZE); } if (viewIds.contains(id)) { if (nowTime - lastTime > DELAY) { callback.onClick(target); lastTime = nowTime; } } else { if (viewIds.size() >= SAME_VIEW_SIZE) { viewIds.remove(0); } viewIds.add(id); callback.onClick(target); lastTime = nowTime; } } public interface Callback { void onClick(View view); } }
那如何才能讓它對(duì)整個(gè)項(xiàng)目的所有點(diǎn)擊事件生效呢?我的解決辦法是這樣的。
第一步,繼承View.OnClickListener在onClick方法中調(diào)用工具類回調(diào)到抽象方法,項(xiàng)目中所有的點(diǎn)擊事件都去繼承這個(gè)抽象類
public abstract class OnFirstClickListener implements View.OnClickListener { @Override public final void onClick(final View v) { ClickHelper.onlyFirstSameView(v, new ClickHelper.Callback() { @Override public void onClick(View view) { onFirstClick(view); } }); } public abstract void onFirstClick(View v); }
第二步,在項(xiàng)目的BaseActivity中實(shí)現(xiàn)View.OnClickListener接口,在onClick方法中調(diào)用工具類,回調(diào)出屏蔽后的點(diǎn)擊事件,子類復(fù)寫onClickWithoutLogin或者onClickCheckLogin方法就可以了。至于為什么會(huì)有2個(gè),看名字就知道了,一個(gè)驗(yàn)證了用戶登錄狀態(tài),僅在登錄狀態(tài)響應(yīng)事件,未登錄則跳轉(zhuǎn)登錄界面,多封裝了一層罷了。
/** * 用注解綁定點(diǎn)擊事件時(shí),在該方法綁定 */ @Override public void onClick(final View v) { ClickHelper.onlyFirstSameView(v, new ClickHelper.Callback() { @Override public void onClick(View view) { if (!onClickWithoutLogin(view)) { if (UserUtils.doIfLogin(getContext())) { onClickCheckLogin(view); } } } }); } /** * 不需要登錄的點(diǎn)擊事件 */ public boolean onClickWithoutLogin(View v) { return false; } /** * 必須登錄的點(diǎn)擊事件 * 如果已經(jīng)登錄直接執(zhí)行,沒有登錄時(shí)跳轉(zhuǎn)登錄界面 */ public void onClickCheckLogin(View v) { }
以上只是個(gè)人開發(fā)中用到的,如果大家有更好的方法,歡迎留言討論。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android通過手勢實(shí)現(xiàn)的縮放處理實(shí)例代碼
Android通過手勢實(shí)現(xiàn)的縮放處理實(shí)例代碼,需要的朋友可以參考一下2013-05-05android基礎(chǔ)總結(jié)篇之一:Activity生命周期
本篇文章主要介紹了android基礎(chǔ)總結(jié)篇之一:Activity生命周期,想要學(xué)習(xí)的可以了解一下。2016-11-11Android CountDownTimer案例總結(jié)
這篇文章主要介紹了Android CountDownTimer案例總結(jié),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Android?debug包運(yùn)行正常release包崩潰的解決辦法
這篇文章主要介紹了Android?debug包運(yùn)行正常,release包崩潰解決辦法,文中通過代碼示例介紹的非常詳細(xì),對(duì)大家解決問題有一定的幫助,需要的朋友可以參考下2024-04-04android調(diào)用WebService實(shí)例分析
這篇文章主要介紹了android調(diào)用WebService的方法,以實(shí)例形式較為詳細(xì)的分析了WebService的調(diào)用原理與具體使用方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Android使用自定義控件HorizontalScrollView打造史上最簡單的側(cè)滑菜單
側(cè)滑菜單一般都會(huì)自定義ViewGroup,然后隱藏菜單欄,當(dāng)手指滑動(dòng)時(shí),通過Scroller或者不斷的改變leftMargin等實(shí)現(xiàn);多少都有點(diǎn)復(fù)雜,完成以后還需要對(duì)滑動(dòng)沖突等進(jìn)行處理,今天給大家?guī)硪粋€(gè)簡單的實(shí)現(xiàn),史上最簡單有點(diǎn)夸張,但是的確是我目前遇到過的最簡單的一種實(shí)現(xiàn)2016-02-02Android 中解決Viewpage調(diào)用notifyDataSetChanged()時(shí)界面無刷新的問題
這篇文章主要介紹了Android 中解決Viewpage調(diào)用notifyDataSetChanged()時(shí)界面無刷新的問題的相關(guān)資料,這里提供相應(yīng)的解決辦法,需要的朋友可以參考下2017-08-08Android 繪制多級(jí)樹形選擇列表實(shí)例代碼
這篇文章主要介紹了Android 繪制多級(jí)樹形選擇列表的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02