In Android geben die meisten Ereignis-Listener-Methoden einen booleschen Wert zurück. Was bedeutet dieser wahre / falsche Wert? Was wird es zu den Subsequenzereignissen führen?
class MyTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
logView.showEvent(event);
return true;
}
}
In Bezug auf das obige Beispiel habe ich festgestellt, dass jedes Berührungsereignis (DOWN, UP, MOVE usw.) gemäß meiner logView erfasst wurde , wenn in der onTouch- Methode true zurückgegeben wurde . Im Gegenteil, wenn return false ist, wurde nur das DOWN-Ereignis erfasst. Es scheint also, dass return false die Ausbreitung des Ereignisses verhindert. Hab ich recht ?
Darüber hinaus müssen in einem OnGestureListener viele Methoden auch einen booleschen Wert zurückgeben. Haben sie die gleiche Bedeutung?
Aus der Dokumentation: http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.View , android.view.MotionEvent)
"Richtig, wenn der Listener das Ereignis konsumiert hat, andernfalls falsch."
Wenn Sie true zurückgeben, wird das Ereignis verarbeitet. Wenn false, wird zur nächsten Ebene nach unten gewechselt.
quelle
Der boolesche Wert bestimmt, ob das Ereignis verbraucht wird oder nicht.
Ja, du hast recht. Wenn Sie false zurückgeben, behandelt der nächste Listener das Ereignis. Wenn true zurückgegeben wird, wird das Ereignis von Ihrem Listener verwendet und nicht an die nächste Methode gesendet.
quelle
true
bedeutet, dass Sie das Ereignis konsumiert haben und den Rest der Ereignisse in der Geste haben möchten - andere Listener / Ansichten erhalten die Ereignisse nicht.false
bedeutet, dass jemand anderes das Ereignis behandelt. Es ist tatsächlich ein bisschen spezifischer als das; siehe meine Antwort.Alle obigen Antworten sind korrekt, aber das Ergebnis ist unterschiedlich, ob die Ansicht ist
clickable
oder nichtclickable
Beispiel , ich habe eine
LinearLayout
enthält 1Button
und 1TextView
wie dieseIn Aktivität habe ich Code wie
Fall 1
Linear onTouch return **FALSE**
,Button onTouch return **FALSE**
,TextView onTouch return **FALSE**
Klicken Sie auf die Schaltfläche
Klicken Sie auf TextView
Klicken Sie auf LinearLayout
Fall 2
Linear onTouch return **FALSE**
,Button onTouch return **TRUE**
,TextView onTouch return **TRUE**
Klicken Sie auf die Schaltfläche
Klicken Sie auf TextView
Klicken Sie auf LinearLayout
Fall 3
Linear onTouch return **TRUE**
,Button onTouch return **FALSE**
,TextView onTouch return **FALSE**
Klicken Sie auf die Schaltfläche
Klicken Sie auf TextView
Klicken Sie auf LinearLayout
Hinweis
TextView
istnot clickable
, es wird anklickbar, wenn wirandroid:clickable="true"
in XML setzen ODER wenn wir setzentextView.setOnClickListener(...)
event MOVE
können Sie mehr als mein Protokoll aufrufen (es hängt davon ab, wie Sie tippen).Zusammenfassung
onTouch
Zurücktrue
oder Ansicht istclickable
, Ansicht erhält alleonTouchEvent
onTouch
Zurückfalse
und Ansicht ist nichtclickable
, Ansicht erhält NEXT onTouchEvent nicht (das übergeordnete Element kann es erhalten)Hoffe es hilft
DEMO
quelle
Ich habe fast einen Tag bei der Fehlerbehebung verloren, aber ich habe herausgefunden, dass meine onTouch-Funktion 2 Mal aufgerufen wird, wenn true verwendet wird, und 1 Mal, wenn false verwendet wird.
quelle
event.getAction()
weil, wenn Siefalse
auf ACTION_DOWN Ereignis zurückkehren, ACTION_UP Ereignis vom Listener ignoriert wirdAus dem Android-Dokument :
Hinweis: Android ruft zuerst Ereignishandler und dann die entsprechenden Standardhandler aus der Klassendefinition auf. Wenn Sie von diesen Ereignis-Listenern true zurückgeben, wird die Weitergabe des Ereignisses an andere Ereignis-Listener gestoppt und der Rückruf an den Standardereignishandler in der Ansicht blockiert. Stellen Sie also sicher, dass Sie das Ereignis beenden möchten, wenn Sie true zurückgeben.
quelle