【Android】关于连续多次点击控件的控制方案(新建监听类)
参考:防止Android过快点击造成多次事件的三种方法_胖胖的博客-CSDN博客
实现逻辑很简单:
-
- 设置限定时间
- 在用户点击时开始计时
- 若计时未超过限定时间,则不允许触发点击事件
因还未学习过Rxjava,因此使用类似文中的第二种进行实现
完成后发现一个小问题:当多个控件绑定一个 Listener 时,点击 控件A 后会对 控件B 也会造成点击限制;初步设想在自定义Listener类的时候多加一个对ID的判断,这样的话要另外设计一个能储存ID和限定时间的数据结构了。
in OnMultiClickListener.java:
public abstract class OnMultiClickListener implements View.OnClickListener {
// 两次点击按钮之间的点击间隔不能少于指定时间
private static final int MIN_CLICK_DELAY_TIME = 5000;
private static long lastClickTime;
public abstract void onMultiClick(View v);
@Override
public void onClick(View v) {
long curClickTime = System.currentTimeMillis();
if((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) {
// 超过点击间隔后再将lastClickTime重置为当前点击时间
lastClickTime = curClickTime;
onMultiClick(v);
}
}
}
使用(使用的类不用继承任何接口了):
public void initView() {
Button listBtn = findViewById(R.id.btn_toListView);
Button testBtn = findViewById(R.id.btn_test);
listBtn.setOnClickListener(multiClickListener);
testBtn.setOnClickListener(multiClickListener);
}
OnMultiClickListener multiClickListener = new OnMultiClickListener() {
@Override
public void onMultiClick(View v) {
switch (v.getId()) {
case R.id.btn_toListView:
Toast.makeText(mContext, "點擊 btn_toListView", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_test:
Toast.makeText(mContext, "點擊 btn_test", Toast.LENGTH_SHORT).show();
break;
default:
throw new IllegalStateException("Unexpected value: " + v.getId());
}
}
};