2015-09-28 13 views
8

ich die Antworten ausgesehen haben hier eine schnelle Doppelklick verhindern - Android Preventing Double Click On A Button und qezt-Lösung wie implementiert und ich habe setEnabled(false) versucht, wie so -Wie auf Knopfdruck

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 

     } 
    }); 

gegen Super Keines dieser Arbeit schnell Doppelklick.

Hinweis - Ich setze doneButton.setEnabled(true) nicht, nachdem meine Verarbeitung abgeschlossen ist. Ich beende einfach() die Aktivität, so dass es keinen Fehler gibt, dass die Schaltfläche zu früh aktiviert wird.

+1

warum wurde nicht 'setEnabled (false)' zu arbeiten? – Blackbelt

+0

wo Sie setEnabled (false) anwenden? – Sree

+0

können Sie es in OnClick-Ereignis geben –

Antwort

8

Ich mache so, es funktioniert sehr gut.

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

    } 

} 
0

try yourbutton.setClickable (false) wie folgt festgelegt:

onclick(){ 
yourbutton.setClickable(false) ; 
ButtonLogic(); 
} 

ButtonLogic(){ 
//your button logic 
yourbutton.setClickable(true); 
} 
+0

Hey, ich habe es versucht, aber die Taste ist immer noch anklickbar, wenn ich sie schnell hintereinander drücke. Ich schätze, die Deaktivierung der Schaltfläche oder der nicht klickbaren Einstellung reicht nicht aus, wenn Sie rechenintensiv in onClick() arbeiten, da Klickereignisse in die Warteschlange gestellt werden können, bevor die Schaltfläche deaktiviert werden kann. Irgendwelche Ideen? – Mallika

+1

Normalerweise verwende ich einen Fortschrittsdialog, um zu verhindern, dass der Benutzer bei Bedarf mit der Benutzeroberfläche interagiert. Vielleicht möchten Sie es versuchen, wenn der Prozess länger dauert als Sie wünschen. –

5

Ich verwende eine Funktion wie diese in den Hörer auf eine Schaltfläche:

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

Qezt Lösung schon gut. Aber wenn Sie superschnelle Doppelklick verhindern wollen, dann einfach Sie die Schwelle reduzieren

// half a second 
    if (SystemClock.elapsedRealtime() - doneButtonClickTime < 500){ 
     return; 
    } 

    // or 100ms 
    if (SystemClock.elapsedRealtime() - doneButtonClickTime < 500){ 
     return; 
    } 
1

Suru Antwort für mich gut funktioniert, danke!

Ich möchte die folgende Antwort für jemanden hinzuzufügen, die https://github.com/balysv/material-ripple/blob/master/library/src/main/java/com/balysv/materialripple/MaterialRippleLayout.java und ist mit diesem Problem konfrontiert ist mit -

app:mrl_rippleDelayClick ist standardmäßig wahr. Dies bedeutet, dass onClick erst ausgeführt wird, wenn das Ripple beendet ist. Daher wird setEnabled(false) inside onClick nach einer Verzögerung ausgeführt, da die Ripple nicht ausgeführt wird und in diesem Zeitraum können Sie auf die Ansicht doppelklicken.

Set app:mrl_rippleDelayClick="false", um dies zu beheben. Dies bedeutet, dass der Aufruf von onClick erfolgt, sobald auf die Ansicht geklickt wird, anstatt darauf zu warten, dass die Ripple nicht mehr angezeigt wird.

+1

Es ist eher ein Kommentar als eine Antwort – Sufian

+1

Es war die bessere Entscheidung, Ihre Antwort als einen Kommentar zu posten. Weil ich das gleiche Problem mit MaterialRippleLayout hatte und ich fand getrennte Lösung dafür. Danke @Mallika. – Jigar

+0

@Jigar, gut zu wissen! Kein Problem :) – Mallika

3

Wahrscheinlich nicht die effizienteste, aber minimal inversive:

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

I obige Verfahren in einer statischen Datei gehalten, und ich werde wie dieses

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

diese Methode für alle Button nennen Sie können diese Methode verwenden. Mit post post delay können Sie auf Doppelklick-Ereignisse achten.

Leere debounceEffectForClick (Ansicht Ansicht) {

view.setClickable(false); 

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

    } 
}, 500); 

}