运用到框架(MVP)的话最好放在baseactivity里边 ,(MVVM)或者放在baseactivity和baseMVVMactivity里边
需要重写事件拦截方法,如果时间戳不匹配就返回true进行拦截,不消费(不进行跳转),反之进行
//防止该activity被上一个页面的多次点击进行多次跳转相同的页面
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
if (isFastDoubleClick()) {
return true;
}
}
return super.dispatchTouchEvent(ev);
}
//开始点击的系统时间
private long lastClickTime=System.currentTimeMillis();
private boolean isFastDoubleClick() {
//第二次点击的系统时间
long time = System.currentTimeMillis();
//记录时间戳
long timeD = time - lastClickTime;
//两次点击时间间隔必须大于0毫秒和小于1000毫秒,可以根据业务需求
if (timeD >= 0 && timeD <= 1000) {
return true;
} else {
lastClickTime = time;
return false;
}
}
第二种方法使用rxjava过滤操作符
protected fun addDebouncingViews(vararg views: View) {
if (mDisposable == null) {
mDisposable = CompositeDisposable()
}
for (view in views) {
val disposable = view.clicks()
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe({ onClickView(view) }) { e("-----onClickView = $it") }
mDisposable?.add(disposable)
}
}
调用
addDebouncingViews(
binding.tvLogin,
binding.tvMyIntegral,
binding.tvMyIntegralRanking,
binding.clQuestionsAndAnswers
)