1. 程式人生 > >【Android】Android防止過快點選造成多次事件執行(防止按鈕重複點選)

【Android】Android防止過快點選造成多次事件執行(防止按鈕重複點選)

在使用者使用 Android 應用的時候,經常會出現過快且多次點選同一按鈕的情況,一方面這是因為應用或手機當前有些卡頓,另一方面也可能是由於很多應用並沒有設定按鈕點選時的 selector 或者其它按鈕響應方式(例如點選按鈕時按鈕放大,常見於遊戲),導致使用者誤認為沒有點選到當前按鈕,當然,除了相對應的對應用進行優化和設定點選selector以外,我們還可以做一些其它的工作,例如,判斷按鈕的 onClick 事件在規定事件段內只響應一次(在論壇的搜尋功能中,我們常見到每10秒才可以進行一次搜尋的設定,這就在一定程度上減少了無效的網路訪問量,減輕伺服器壓力,APP同理),就如下面程式碼所示:

public
classUtils { // 兩次點選按鈕之間的點選間隔不能少於1000毫秒 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; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Utils.isFastClick()) {
                    // 進行點選事件後的邏輯操作
                }
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

上面的程式碼可以保證同一按鈕在1秒內只會響應一次點選事件,這也是大家最常用的方法,不過我更喜歡另一種方法:

public abstract classOnMultiClickListenerimplementsView.OnClickListener{
    // 兩次點選按鈕之間的點選間隔不能少於1000毫秒
    private static final int MIN_CLICK_DELAY_TIME = 1000;
    private static long lastClickTime;

    public abstract void onMultiClick(View v);

    @Override
    public void onClick(View v) {
        long curClickTime = System.currentTimeMillis();
        if((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) {
            // 超過點選間隔後再將lastClickTime重置為當前點選時間
            lastClickTime = curClickTime;
            onMultiClick(v);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
btn.setOnClickListener(new OnMultiClickListener() {
            @Override
            public void onMultiClick(View v) {
                // 進行點選事件後的邏輯操作
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

題外話

我個人是非常建議給按鈕都設定點選 selector 的,這樣可以清楚的給使用者提示,不過在 Android 專案中並不都是因為沒有設定 selector 而導致使用者感覺沒有點選中這個按鈕的,還有一種情況就是這個按鈕的可點選熱區太小了,或者較小的區域內承載了過多的可點選按鈕。

針對按鈕的可點選熱區較小的情況,我覺得可以使用控制元件的 paddingxxx 屬性替代部分 marginxxx 屬性,margin屬性指的控制元件之外的區域,padding則可以將這些區域歸為自身所有,這樣既可在不改變 UI 的情況下擴大點選熱區。

參考連結