如何防止快速双击按钮

我已经看过这里的答案 – Android防止双击一个按钮并实现了qezt的解决方案,我尝试了setEnabled(false)就像这样 –

 doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // mis-clicking prevention, using threshold of 1 second if (SystemClock.elapsedRealtime() - doneButtonClickTime < 1000){ return; } //store time of button click doneButtonClickTime = SystemClock.elapsedRealtime(); doneButton.setEnabled(false); //do actual work } }); 

这些都不能对抗超快速双击。

注意 – 我的处理完成后我没有设置doneButton.setEnabled(true) 。 我只是简单地完成了()活动,所以没有问题的按钮过早启用。

我这样做,效果很好。

 public abstract class OnOneOffClickListener implements View.OnClickListener { private static final long MIN_CLICK_INTERVAL=600; private long mLastClickTime; public static boolean isViewClicked = false; public abstract void onSingleClick(View v); @Override public final void onClick(View v) { long currentClickTime=SystemClock.uptimeMillis(); long elapsedTime=currentClickTime-mLastClickTime; mLastClickTime=currentClickTime; if(elapsedTime<=MIN_CLICK_INTERVAL) return; if(!isViewClicked){ isViewClicked = true; startTimer(); } else { return; } onSingleClick(v); } /** * This method delays simultaneous touch events of multiple views. */ private void startTimer() { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { isViewClicked = false; } }, 600); } } 

我在按钮的监听器中使用这样的函数:

 public static long lastClickTime = 0; public static final long DOUBLE_CLICK_TIME_DELTA = 500; public static boolean isDoubleClick(){ long clickTime = System.currentTimeMillis(); if(clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){ lastClickTime = clickTime; return true; } lastClickTime = clickTime; return false; } 

可能不是最有效,但最小的反转:

 ... onClick(View v) { MultiClickPreventer.preventMultiClick(v); //your op here } ... public class MultiClickPreventer { private static final long DELAY_IN_MS = 500; public static void preventMultiClick(final View view) { if (!view.isClickable()) { return; } view.setClickable(false); view.postDelayed(new Runnable() { @Override public void run() { view.setClickable(true); } }, DELAY_IN_MS); } } 

Suru的回答对我很有用,谢谢!

我想为使用https://github.com/balysv/material-ripple/blob/master/library/src/main/java/com/balysv/materialripple/MaterialRippleLayout.java的任何人添加以下答案。面对这个问题 –

app:mrl_rippleDelayClick默认为true。 这意味着,onClick只有在完成显示纹波后才会执行。 因此onClick中的setEnabled(false)将在延迟后执行,因为纹波未执行,在此期间您可以双击视图。

设置app:mrl_rippleDelayClick="false"来解决此问题。 这意味着只要单击视图就会发生对onClick的调用,而不是等待波纹完成显示。

您可以使用此方法。 通过使用延迟后,您可以照顾双击事件。

void debounceEffectForClick(查看视图){

 view.setClickable(false); view.postDelayed(new Runnable() { @Override public void run() { view.setClickable(true); } }, 500); 

}

尝试设置yourbutton.setClickable(false),如下所示:

 onclick(){ yourbutton.setClickable(false) ; ButtonLogic(); } ButtonLogic(){ //your button logic yourbutton.setClickable(true); } 
 public static void disablefor1sec(final View v) { try { v.setEnabled(false); v.setAlpha((float) 0.5); v.postDelayed(new Runnable() { @Override public void run() { try { v.setEnabled(true); v.setAlpha((float) 1.0); } catch (Exception e) { Log.d("disablefor1sec", " Exception while un hiding the view : " + e.getMessage()); } } }, 1000); } catch (Exception e) { Log.d("disablefor1sec", " Exception while hiding the view : " + e.getMessage()); } } 

我将上面的方法保存在一个静态文件中,我会像这样调用所有buttonclick的方法

  button_or_textview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { StaticFile.disablefor1sec(button_or_textview); // Do Somthing. } }); 

Qezt解决方案已经很好了。 但是如果你想要防止超快速双击,那么你只需减少阈值

  // half a second if (SystemClock.elapsedRealtime() - doneButtonClickTime < 500) { return; } // or 100ms (1/10 of second) if (SystemClock.elapsedRealtime() - doneButtonClickTime < 100) { return; }