Cómo evitar un doble clic rápido en un botón

He mirado las respuestas aquí – Android Prevención Doble clic en un botón y la solución puesta en práctica qezt como y he intentado setEnabled(false) como así –

 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 } }); 

Ninguno de estos trabajos contra super rápido doble clic.

Nota – No estoy configurando doneButton.setEnabled(true) después de que se doneButton.setEnabled(true) mi procesamiento. Simplemente termino () la actividad por lo que no hay problema de que el botón se habilite demasiado pronto.

Estoy haciendo esto funciona muy bien.

 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); } } 

Utilizo una función como esta en el oyente de un botón:

 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; } 

Probablemente no es lo más eficiente, pero mínimo inversivo:

 ... 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); } } 

¡La respuesta de Suru funcionó bien para mí, gracias!

Me gustaría añadir la siguiente respuesta para cualquiera que esté usando https://github.com/balysv/material-ripple/blob/master/library/src/main/java/com/balysv/materialripple/MaterialRippleLayout.java y es Frente a este problema –

app:mrl_rippleDelayClick es true de forma predeterminada. Esto significa que onClick se ejecutará sólo después de que termine de mostrar la ondulación. Por setEnabled(false) tanto, setEnabled(false) dentro de onClick se ejecutará después de un retardo porque la ondulación no se ejecuta y en ese período puede hacer doble clic en la vista.

Establecer app:mrl_rippleDelayClick="false" para arreglar esto. Esto significa que la llamada a onClick sucederá tan pronto como se haga clic en la vista, en lugar de esperar a que la ondulación finalice.

Intenta establecer yourbutton.setClickable (false) como este:

 onclick(){ yourbutton.setClickable(false) ; ButtonLogic(); } ButtonLogic(){ //your button logic yourbutton.setClickable(true); } 

Qezt solución ya está bien. Pero si desea evitar super rápido doble clic, entonces simplemente reducir el umbral

  // half a second if (SystemClock.elapsedRealtime() - doneButtonClickTime < 500){ return; } // or 100ms if (SystemClock.elapsedRealtime() - doneButtonClickTime < 500){ return; } 
 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()); } } 

Me mantuve por encima del método en un archivo estático y voy a llamar a este método para todos los buttonclick como este

  button_or_textview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { StaticFile.disablefor1sec(button_or_textview); // Do Somthing. } }); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.