在項目我們通常會遇到一個問題,如果用戶快速點擊時候,會重復打開多個界面,雖然大部分情況下不會影響使用,但是還是會給用戶造成不良的使用感受,下面將會介紹一些簡單的處理方式,針對不同的場景進行不同的使用
1. 我自己在用的防止創(chuàng)建多界面的方法,因為防止雙擊主要是防止activity被重復創(chuàng)建,我們一般都會在項目中定義BaseActivity和BaseFragment類,所以我想到通過直接重寫這兩個類中的startActivity方法來解決重復創(chuàng)建的方法
重寫基類中的startActivityForResult方法,因為startActivity最終調用的都是這個方法,并且在onResume中對clickable進行置為true,如果是Basefragment需要在setUserVisibleHint方法中對clickable進行重置true
boolean clickable = true;
/**
* 當前是否可以點擊
* @return
*/
protected Boolean isClickable() {
return clickable;
}
/**
* 鎖定點擊
*/
protected void lockClick() {
clickable = false;
}
@Override
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
if (isClickable()) {
lockClick();
super.startActivityForResult(intent, requestCode, options);
}
}
BaseActivity中
@Override
protected void onResume() {
super.onResume();
clickable = true;
}
BaseFragment中
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
clickable = true;
}
2. 雙擊時間檢測,針對單個按鈕
private long mLastClickTime = 0;
public static final long TIME_INTERVAL = 1000L;
private Button btTest;
private void initView() {
btTest = findViewById(R.id.bt_test);
btTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
long nowTime = System.currentTimeMillis();
if (nowTime - mLastClickTime > TIME_INTERVAL) {
// do something
mLastClickTime = nowTime;
} else {
Toast.makeText(MainActivity.this, "不要重復點擊", Toast.LENGTH_SHORT).show();
}
}
});
}
代碼中使用
/**
* 點擊事件
*/
private View.OnClickListener logListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!NoDoubleClickUtils.isDoubleClick()) {
事件響應方法
}
}
};
3. 設置Activity的加載模式為 SingleTop
如果了解SingleTop模式就會知道SingleTop可以防止棧頂?shù)腁ctivity被重復的創(chuàng)建。但是如果界面可以自己跳轉到自己,就不能使用這種方法
4. 利用rxBinding 中的 rxView來解決,需要引入rxbinding第三方庫
RxView.clicks(view)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
// do something
}
});
響應式解決