在项目我们通常会遇到一个问题,如果用户快速点击时候,会重复打开多个界面,虽然大部分情况下不会影响使用,但是还是会给用户造成不良的使用感受,下面将会介绍一些简单的处理方式,针对不同的场景进行不同的使用
1. 我自己在用的防止创建多界面的方法,因为防止双击主要是防止activity被重复创建,我们一般都会在项目中定义BaseActivity和BaseFragment类,所以我想到通过直接重写这两个类中的startActivity方法来解决重复创建的方法
重写基类中的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可以防止栈顶的Activity被重复的创建。但是如果界面可以自己跳转到自己,就不能使用这种方法
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
}
});
响应式解决