为了对付拥有麒麟臂的测试人员或者用户对我们的按钮等控件展开惨无人道的快速啄击。厮以为可以用如下方法:
1 setEnabled 大法;在用户点击发生后调用setEnable(false);阻止持续受到伤害。而onClick中的处理逻辑执行完后再调用setEnable(true);进行迎击。此法代码多,且逻辑难处理,不推荐。
2 DoubleKill 大法;对于一些不想改动现有逻辑的童鞋可以选用该方法,样例如下:
定义: public final class DoubleKill { final static long CLICK_INTERVAL = 500L;// 允许的快速点击间隔 private final static HashMap<Integer, Long> mLastClickTime = new HashMap(); static long lastTime(int key) { return mLastClickTime.containsKey(key) ? mLastClickTime.get(key) : 0L; } static void lastTime(int key, long lastTime) { mLastClickTime.put(key, lastTime); } public static boolean isFastDoubleClick(View view) { int key = view.hashCode(); long currTime = System.currentTimeMillis(); if (currTime - lastTime(key) < CLICK_INTERVAL) { return true; } else { lastTime(key, currTime); return false; } } } 调用: view.setOnClickListener(new View.OnClickListener(){ public void onClick(View view){ if(DoubleKill.isFastDoubleClick(view)){ return; } // 其他代码。。。。 } });
3 继承大法;对于新开项目可以手动实现OnClickListener来进行阻击,废话不说,上代码:
定义: public abstract class SingleClickListener<iCallView extends View> implements View.OnClickListener { final static long CLICK_INTERVAL = 500L; protected long mLastClickTime = 0L; @Override public final void onClick(View v) { if (System.currentTimeMillis() - mLastClickTime < CLICK_INTERVAL) { return; } mLastClickTime = System.currentTimeMillis(); click((iCallView) v); } public abstract void click(iCallView view); } 调用: view.setOnClickListener(new SingleClickListener<TextView>() { @Override public void click(TextView view) { Toast.makeText(mCxt, "轻点!疼", Toast.LENGTH_SHORT).show(); } });
此结!