您好,登錄后才能下訂單哦!
小編給大家分享一下Android中怎樣屏蔽View的重復(fù)點擊,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
前言
android 防止重復(fù)點擊是一個非常常見的需求,每個人都有各自的點擊事件的處理習(xí)慣,有的喜歡使用匿名內(nèi)部類,有的activity、fragment、自定義View等繼承點擊事件然后在onClick()方法中根據(jù)id用switch實現(xiàn)各自View的點擊事件。
在開發(fā)中我們經(jīng)常需要這樣的需求,比如一個驗證碼發(fā)送按鈕,我們只想讓它響應(yīng)500毫秒中的第一次點擊事件,該如何處理呢?你可能會說這個簡單,在點擊事件中獲取當(dāng)前時間與上次的比較下,如果小于500毫秒就return掉。是的,這樣可以解決,但是如果現(xiàn)在整個項目的所有按鈕點擊事件都需要這樣的需求,該如何處理?不可能內(nèi)個點擊事件中都加入這幾行代碼吧。
這里先放上我寫的一個響應(yīng)第一次點擊的工具類,可實現(xiàn)2種模式:
第一種:無論點擊的哪個View,僅響應(yīng)第一次點擊
第二章:同一個View上僅響應(yīng)第一次點擊,不同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); } }
那如何才能讓它對整個項目的所有點擊事件生效呢?我的解決辦法是這樣的。
第一步,繼承View.OnClickListener在onClick方法中調(diào)用工具類回調(diào)到抽象方法,項目中所有的點擊事件都去繼承這個抽象類
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); }
第二步,在項目的BaseActivity中實現(xiàn)View.OnClickListener接口,在onClick方法中調(diào)用工具類,回調(diào)出屏蔽后的點擊事件,子類復(fù)寫onClickWithoutLogin或者onClickCheckLogin方法就可以了。至于為什么會有2個,看名字就知道了,一個驗證了用戶登錄狀態(tài),僅在登錄狀態(tài)響應(yīng)事件,未登錄則跳轉(zhuǎn)登錄界面,多封裝了一層罷了。
/** * 用注解綁定點擊事件時,在該方法綁定 */ @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); } } } }); } /** * 不需要登錄的點擊事件 */ public boolean onClickWithoutLogin(View v) { return false; } /** * 必須登錄的點擊事件 * 如果已經(jīng)登錄直接執(zhí)行,沒有登錄時跳轉(zhuǎn)登錄界面 */ public void onClickCheckLogin(View v) { }
以上是“Android中怎樣屏蔽View的重復(fù)點擊”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。