2017-04-17 2 views
1

Meine App verfügt über eine Ansicht, die anklickbar ist, und wenn diese Ansicht angeklickt wird, sollte ein handleClickEvent() aufgerufen werden. Ich habe versucht, einen OnClickListener für die Ansicht zu setzen, aber wenn der Benutzer zweimal auf die Ansicht tippt, wird handleClickEvent() zweimal aufgerufen. Ich möchte nicht, dass es beim Doppeltippen zweimal aufgerufen wird. I.e. Ich möchte, dass handleClickEvent() ONCE sowohl für Einzelklick als auch Doppeltipp genannt wird.Android vermeiden Sie das Anrufen einzelner Tipp zweimal für Doppeltipp, ohne onSingleTapConfirmed

Ich habe einige Nachforschungen gemacht und diese Frage herausgefunden: Android detecting double tap without single tap first Ich habe versucht, was in der Antwort vorgeschlagen, d. H. Ein GestureDetector mit onSingleTapConfirmed() -Methode implementieren. Das hat funktioniert, aber ich bemerke, dass es eine merkliche Verzögerung bei der Antwortzeit gibt, verglichen mit der Verwendung von OnClickListener. Ich nehme an, dass onSingleTapConfirmed() nur aufgerufen wird, nachdem das System bestätigt, dass es sich um ein einzelnes Tippen handelt, indem es auf einen bestimmten Zeitraum wartet.

Gibt es das trotzdem ohne merkliche Verzögerung? Eine weitere Option, die ich mir vorstellen kann, ist eine lastClickedTimeStamp-Membervariable zu haben, die aktuelle Zeit zu vergleichen, wenn auf lastClickedTimeStamp geklickt wird, und wenn sie innerhalb eines bestimmten Schwellenwerts liegt, nichts tun.

Ich frage mich, ob es andere Optionen gibt?

Vielen Dank!

Antwort

2

So wie ich das tun würde, es eine Zustandsgröße als lang eingestellt ist und es timeOfLastTouch anrufen und ihn auf 0. Dann diesen Code in jeder OnClickListener Funktion gesetzt setzen in ihren

long currentTime = System.currentTimeMillis(); 
if (timeOfLastTouch + 100 < currentTime) { 
    // code 
    timeOfLastTouch = System.currentTimeMillis(); 
} 
+0

Sie auf dieser Ansicht Berührungsereignis eingestellt Vielen beziehen! Ja, ich denke, das wird funktionieren. Ich habe mich nur gefragt, ob da etwas eingebaut ist, das es könnte. Wenn nicht, werde ich mit diesem Ansatz fortfahren. – HeyThere

0

Sie können versuchen, GestureDetector.SimpleOnGestureListener mit und kombiniere es mit onTouchEvent.

private GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { 
    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     Log.d("SingleTap", " is detected"); 
     return true; 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     Log.d("DoubleTap", " is detected"); 
     return true; 
    } 
}); 

dann, entfernen OnClickListener und

yourView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     return gestureDetector.onTouchEvent(event); 
    } 
}); 

Sie zu Detecting Common Gestures

+0

Wie ich in der Frage erwähnt habe, habe ich diesen Ansatz bereits versucht. Es funktioniert, aber es gibt eine merkliche Verzögerung zwischen dem Klicken des Benutzers auf die Ansicht und dem Aufruf von handleClickEvent(). Daher suche ich nach einem alternativen Ansatz, wenn möglich. Vielen Dank! – HeyThere

+0

Mein schlechtes. Ich habe den obigen Link nicht bemerkt. Wenn dies der Fall ist, warum setzen Sie die Ansicht nicht auf anklickbar (false), wenn handleClickEvent aufgerufen wird, und setzen Sie sie auf "true", wenn Sie fertig sind? So viel einfacher. –

Verwandte Themen