参考:防止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());
- }
- }
- };