【Android】Android防止過快點選造成多次事件執行(防止按鈕重複點選)
阿新 • • 發佈:2019-02-03
在使用者使用 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 的情況下擴大點選熱區。