??android 防止重復(fù)點(diǎn)擊是一個(gè)非常常見(jiàn)的需求顾孽,每個(gè)人都有各自的點(diǎn)擊事件的處理習(xí)慣,有的喜歡使用匿名內(nè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)擊事件筝家。之前增刪改之類的操作都彈出確認(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,沖突的可能性很小蹭越。