android 防止重復(fù)點(diǎn)擊

??android 防止重復(fù)點(diǎn)擊是一個(gè)非常常見(jiàn)的需求,每個(gè)人都有各自的點(diǎn)擊事件的處理習(xí)慣,有的喜歡使用匿名內(nèi)部類(lèi),有的activity、fragment、自定義View等繼承點(diǎn)擊事件然后在onClick()方法中根據(jù)id用switch實(shí)現(xiàn)各自View的點(diǎn)擊事件。

??我自己的習(xí)慣呢,就是用switch進(jìn)行分發(fā),統(tǒng)一在一個(gè)地方管理點(diǎn)擊事件。之前增刪改之類(lèi)的操作都彈出確認(rèn)對(duì)話框,所以不存在防止重復(fù)點(diǎn)擊。但是近來(lái)產(chǎn)品經(jīng)理覺(jué)得就刪除給確認(rèn)對(duì)話框就行了,其它的直接發(fā)請(qǐng)求就行了。
于是我需要在原來(lái)代碼基礎(chǔ)上迅速增加防止重復(fù)點(diǎn)擊的功能。
我記得大概的防止重復(fù)點(diǎn)擊有實(shí)現(xiàn)setOnTouchListener的,有實(shí)現(xiàn)setOnClickListener的,也有用靜態(tài)工具方法的。
??比如:

public abstract class OnClickEvent implements View.OnClickListener {
    private static long lastTime;
    public abstract void singleClick(View v);
    private long delay;
    public OnClickEvent(long delay) {
        this.delay = delay;
    }
    @Override
    public void onClick(View v) {
        if (onMoreClick(v)) {
            return;
        }
        singleClick(v);
    }
    public boolean onMoreClick(View v) {
        boolean flag = false;
        long time = System.currentTimeMillis() - lastTime;
        if (time < delay) {
            flag = true;
        }
        lastTime = System.currentTimeMillis();
        return flag;
    }
}

??比如:

public class Utils {
    private static final int MIN_CLICK_DELAY_TIME = 1000;
    private static long lastClickTime;
    public static boolean isFastClick() {
        boolean flag = false;
        long curClickTime = System.currentTimeMillis();
        if ((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) {
            flag = true;
        }
        lastClickTime = curClickTime;
        return flag;
    }
}

??因?yàn)槲掖a中所有點(diǎn)擊事件都統(tǒng)一實(shí)現(xiàn)onClick用switch根據(jù)id分發(fā),所以要增加防止重復(fù)點(diǎn)擊,實(shí)現(xiàn)接口的方式就不太現(xiàn)實(shí)了。所以我覺(jué)得才有靜態(tài)工具的方式。
但是普通靜態(tài)工具的方式,那個(gè)lastTime是全局的,這顯然是不科學(xué)的,可以遇見(jiàn)連續(xù)點(diǎn)兩個(gè)按鈕的時(shí)候第二個(gè)按鈕點(diǎn)點(diǎn)擊事件會(huì)被當(dāng)做重復(fù)點(diǎn)擊給忽略掉,雖然這個(gè)問(wèn)題不太容易被產(chǎn)品經(jīng)理發(fā)現(xiàn),但是我自己覺(jué)得還是不爽。于是我采用了下面這種靜態(tài)工具方法:

private static boolean avoidRepeatClick(View view){
        boolean flag = false;
        long lastTime = view.getTag(-1)==null?0:(long)view.getTag(-1);
        if (System.currentTimeMillis()-lastTime>1000){
            flag = true;
        }
        view.setTag(-1,System.currentTimeMillis());
        return flag;
    }

??用view的tag屬性來(lái)保存自己的點(diǎn)擊時(shí)機(jī),代碼更少,不會(huì)出現(xiàn)上述問(wèn)題,只需要避免-1這個(gè)tag的key和其它沖突,不過(guò)重度使用view的tag屬性時(shí)一般都會(huì)在String中定義id,沖突的可能性很小。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評(píng)論 25 708
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,380評(píng)論 0 17
  • 原文地址:http://www.android100.org/html/201606/06/241682.html...
    AFinalStone閱讀 1,322評(píng)論 0 1
  • z=x+y的分布函數(shù)。 比喻為小明能吃一碗飯,小紅能吃?xún)赏腼?。小明加起?lái)能吃的飯就是z=x+y。 網(wǎng)關(guān):比喻為你被...
    我是一個(gè)好人嗎閱讀 481評(píng)論 0 0
  • 001.運(yùn)動(dòng)前后注重拉伸。 用5-10分鐘的時(shí)間進(jìn)行拉伸,避免運(yùn)動(dòng)中受到傷害。運(yùn)動(dòng)后更應(yīng)該拉伸,避免肌肉酸痛。 0...
    影子倒了閱讀 423評(píng)論 2 2

友情鏈接更多精彩內(nèi)容