開發(fā)過程中迈螟,我們經(jīng)常會用到OnClick點(diǎn)擊事件弄息,常用的寫法可能是這樣的:
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//TODO
}
});
或者是這樣的:
btn.setOnClickListener(this);
@Override
public void onClick(View v) {
//TODO
}
正常情況下海渊,這樣的代碼是沒有什么問題的绵疲,但是大家都知道安卓碎片化嚴(yán)重,每個手機(jī)的性能也千差萬別臣疑。想必大家都遇到過盔憨,在比較卡的手機(jī)上,快速點(diǎn)擊按鈕打開一個頁面讯沈,結(jié)果發(fā)現(xiàn)這個頁面被打開了兩次...
一般這種情況下郁岩,我們會打開百度,看看萬能的網(wǎng)友都是怎么處理這種問題的(當(dāng)時我就是這么做的??)缺狠,搜索到的處理方式可能是這樣的:
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//TODO
btn.setClickable(false);
btn.setEnabled(false);
}
});
也可能是這樣的:
public abstract class NoDoubleClickListener implements OnClickListener {
public static final int MIN_CLICK_DELAY_TIME = 1000;
private long lastClickTime = 0;
@Override
public void onClick(View v) {
long currentTime = Calendar.getInstance().getTimeInMillis();
if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME{
lastClickTime = currentTime;
onNoDoubleClick(v);
}
}
public abstract void onNoDoubleClick(View v);
}
btn.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onNoDoubleClick(View v) {
//TODO
}
});
還有的說用RxBinding问慎,由于涉及到Rxjava相關(guān)的知識,篇幅原因挤茄,我這里就不過多描述如叼,感興趣的同學(xué)可以自行百度了解。
當(dāng)然穷劈,上述幾種方式均能達(dá)到防止按鈕快速點(diǎn)擊笼恰,但是其弊端也比較明顯。先說第一種方式歇终,這種方法雖然可以防止快速點(diǎn)擊社证,但是其給體驗(yàn)上的影響還是非常大的,想想如果你這個按鈕點(diǎn)擊后會有網(wǎng)絡(luò)請求练湿,如果網(wǎng)絡(luò)請求執(zhí)行過程比較長的話猴仑,按鈕一直無法被點(diǎn)擊审轮,會讓用戶以為出現(xiàn)了bug肥哎;方式二相比第一種方法辽俗,體驗(yàn)上倒是沒什么問題,但是其弊端在于只能通過匿名內(nèi)部類的方式注冊點(diǎn)擊事件篡诽,當(dāng)出現(xiàn)一個界面按鈕比較多崖飘,寫起來代碼就顯得比較臃腫了。
說了這么多杈女,是時候展示真正的技術(shù)了朱浴,不多BB,直接上代碼达椰。
首先我們定義一個點(diǎn)擊事件接口
public interface OnLimitClickListener {
/**
* 按鈕點(diǎn)擊事件
* @param view
*/
void onClick(View view);
}
再定義一個抽象類對我們的點(diǎn)擊事件做一層包裝
public class OnLimitClickHelper implements View.OnClickListener {
public static final int LIMIT_TIME = 300;
private long lastClickTime = 0;
private OnLimitClickListener onLimitClickListener = null;
public OnLimitClickHelper(OnLimitClickListener onLimitClickListener){
this.onLimitClickListener = onLimitClickListener;
}
@Override
public void onClick(View v) {
long curTime = Calendar.getInstance().getTimeInMillis();
if (curTime - lastClickTime > LIMIT_TIME) {
lastClickTime = curTime;
if(onLimitClickListener != null){
onLimitClickListener.onClick(v);
}
}
}
}
ok,完工翰蠢!??????
最后我們看看Activity的使用:
public abstract class MainActivity extends AppCompatActivity implements OnLimitClickListener {
private Button btn = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = findViewById(R.id.btn);
btn.setOnClickListener(new OnLimitClickHelper(this));
}
@Override
public void onClick(View v) {
//TODO
}
}
覺得寫的不錯的朋友,幫忙點(diǎn)下喜歡啰劲,你們的支持是我創(chuàng)作的動力梁沧!大家有什么問題也可以在下方評論,有時間我會一一解答蝇裤,感謝廷支!