Android開發(fā)教程之如何屏蔽View的重復(fù)點(diǎn)擊
前言
android 防止重復(fù)點(diǎn)擊是一個非常常見的需求,每個人都有各自的點(diǎn)擊事件的處理習(xí)慣,有的喜歡使用匿名內(nèi)部類,有的activity、fragment、自定義View等繼承點(diǎn)擊事件然后在onClick()方法中根據(jù)id用switch實現(xiàn)各自View的點(diǎn)擊事件。
在開發(fā)中我們經(jīng)常需要這樣的需求,比如一個驗證碼發(fā)送按鈕,我們只想讓它響應(yīng)500毫秒中的第一次點(diǎn)擊事件,該如何處理呢?你可能會說這個簡單,在點(diǎn)擊事件中獲取當(dāng)前時間與上次的比較下,如果小于500毫秒就return掉。是的,這樣可以解決,但是如果現(xiàn)在整個項目的所有按鈕點(diǎn)擊事件都需要這樣的需求,該如何處理?不可能內(nèi)個點(diǎn)擊事件中都加入這幾行代碼吧。
這里先放上我寫的一個響應(yīng)第一次點(diǎn)擊的工具類,可實現(xiàn)2種模式:
- 第一種:無論點(diǎn)擊的哪個View,僅響應(yīng)第一次點(diǎn)擊
- 第二章:同一個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);
}
}
那如何才能讓它對整個項目的所有點(diǎn)擊事件生效呢?我的解決辦法是這樣的。
第一步,繼承View.OnClickListener在onClick方法中調(diào)用工具類回調(diào)到抽象方法,項目中所有的點(diǎn)擊事件都去繼承這個抽象類
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)出屏蔽后的點(diǎn)擊事件,子類復(fù)寫onClickWithoutLogin或者onClickCheckLogin方法就可以了。至于為什么會有2個,看名字就知道了,一個驗證了用戶登錄狀態(tài),僅在登錄狀態(tài)響應(yīng)事件,未登錄則跳轉(zhuǎn)登錄界面,多封裝了一層罷了。
/**
* 用注解綁定點(diǎ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);
}
}
}
});
}
/**
* 不需要登錄的點(diǎn)擊事件
*/
public boolean onClickWithoutLogin(View v) {
return false;
}
/**
* 必須登錄的點(diǎn)擊事件
* 如果已經(jīng)登錄直接執(zhí)行,沒有登錄時跳轉(zhuǎn)登錄界面
*/
public void onClickCheckLogin(View v) {
}
以上只是個人開發(fā)中用到的,如果大家有更好的方法,歡迎留言討論。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android自定義FloatingActionButton滑動行為只隱藏不出現(xiàn)的問題小結(jié)
這篇文章主要介紹了Android自定義FloatingActionButton滑動行為只隱藏不出現(xiàn)的問題小結(jié),需要的朋友可以參考下2017-01-01
Android中使用Theme來解決啟動app時出現(xiàn)的空白屏問題
相信大多數(shù)人一開始都會對啟動app的時候出現(xiàn)先白瓶或者黑屏然后才進(jìn)入第一個界面,例如:SplashActivity。那這是什么原因造成的呢?下面小編給大家介紹下2016-12-12
android 獲取本機(jī)其他app的版本信息的示例代碼
本篇文章主要介紹了android 獲取本機(jī)其他app的版本信息的示例代碼,具有一定的參考價值,有興趣的可以了解一下2017-09-09
基于Android實現(xiàn)的文件同步設(shè)計方案
隨著用戶對自身數(shù)據(jù)保護(hù)意識的加強(qiáng),讓用戶自己維護(hù)自己的數(shù)據(jù)也成了獨(dú)立開發(fā)產(chǎn)品時的一個賣點(diǎn),若只針對少量的文件進(jìn)行同步,則實現(xiàn)起來比較簡單,當(dāng)針對一個多層級目錄同步時,情況就復(fù)雜多了,本文我分享下我的設(shè)計思路2023-10-10

