概述
當對一個按鈕快速點擊的時候,往往很可能會多次觸發同一個邏輯,在有些場景下,會顯得極度不合理。而且,這種情況在性能較低的手機上觸發概率更高。
比如,點擊一個按鈕打開登錄頁面,如果用戶點擊過快的話,完全可能會跳出兩個登錄頁面。
個人總結了一下針對這種情況的幾種處理方式,如有問題或者其他更好的方式可以評論交流。
處理方式
第一次點擊後,讓點擊事件失效
這種情況更適合於一些耗時的操作,比如網絡操作等。
需要注意的是,一般情況下,在操作結束後,需要把點擊事件設置爲生效。
final Button btn=new Button(this);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn.setClickable(false);
}
});
使用參數攔截點擊事件
一般是設置一個boolean值來判斷時候已經點擊過,或者時候正在操作中,如果是的話,那麼再次點擊只會直接return。
private boolean hasSetFlag=false;
private int flag;
public void setFlag(int flag) {
if(hasSetFlag){
this.flag=flag;
}
}
設置點擊間隔
如果兩次點擊在點擊時間間隔內,就不生效。
需要注意的是,FastClickManager儘量都直接寫到點擊事件的方法中,而不要寫到其他邏輯裏。否則如果其他邏輯觸發了FastClick的邏輯,有可能會導致點擊事件失效。
public class FastClickManager {
private static final int DEFAULT_FAST_CLICK_INTERVAL = 500;
private static long lastClickTime = 0L;
public FastClickManager() {
}
public static boolean isFastDoubleClick() {
return isFastDoubleClick(DEFAULT_FAST_CLICK_INTERVAL);
}
public static boolean isFastDoubleClick(long intervalMillis) {
long now = SystemClock.elapsedRealtime();
if (Math.abs(now - lastClickTime) < intervalMillis) {
return true;
} else {
lastClickTime = now;
return false;
}
}
}
final Button btn=new Button(this);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(FastClickManager.isFastDoubleClick()){
return;
}
}
});