In Android geben die meisten Ereignislistener-Methoden einen booleschen Wert zurück. Was bedeutet dieser wahr/falsch Wert? was wird es zu den Folgeereignissen führen?
class MyTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
logView.showEvent(event);
return true;
}
}
Was das obige Beispiel angeht: Wenn in der onTouch -Methode true zurückgegeben wird, habe ich festgestellt, dass jedes Berührungsereignis (DOWN, UP, MOVE usw.) gemäß meinem logView erfasst wurde. Im Gegenteil, wenn false zurückgegeben wird, wurde nur das DOWN-Ereignis erfasst. Es ist also offensichtlich, dass die Rückgabe falsch verhindert, dass sich das Ereignis ausbreitet. Hab ich recht ?
Darüber hinaus müssen in einem OnGestureListener viele Methoden auch einen booleschen Wert zurückgeben. Haben sie die gleiche Bedeutung?
Wenn Sie true
von einem ACTION_DOWN
-Ereignis zurückgeben, sind Sie an den restlichen Ereignissen in dieser Geste interessiert. Eine "Geste" bedeutet in diesem Fall alle Ereignisse bis zum endgültigen ACTION_UP
oder ACTION_CANCEL
. Wenn Sie false
aus einem ACTION_DOWN
zurückgeben, bedeutet dies, dass Sie das Ereignis nicht wünschen und andere Ansichten die Möglichkeit haben, es zu bearbeiten. Wenn Sie überlappende Ansichten haben, kann dies eine gleichgeordnete Ansicht sein. Wenn nicht, sprudelt es zum übergeordneten Element.
Aus der Dokumentation: http://developer.Android.com/reference/Android/view/View.OnTouchListener.html#onTouch(Android.view.View , Android.view.MotionEvent)
"True, wenn der Listener das Ereignis belegt hat, andernfalls false."
Wenn Sie true zurückgeben, wird das Ereignis verarbeitet. Wenn dies nicht der Fall ist, wird zur nächsten Ebene weitergeschaltet.
Der boolesche Wert bestimmt, ob das Ereignis konsumiert wird oder nicht.
Ja, du hast recht. Wenn Sie false zurückgeben, verarbeitet der nächste Listener das Ereignis. Wenn true zurückgegeben wird, wird das Ereignis von Ihrem Listener verarbeitet und nicht an die nächste Methode gesendet.
Alle obigen Antworten sind korrekt, aber das Ergebnis ist anders, wenn die Ansicht clickable
ist oder nicht clickable
.
Beispiel, ich habe eine LinearLayout
, die 1 Button
und 1 TextView
enthält
<LinearLayout
Android:id="@+id/linearlayout_root"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#0aa"
Android:orientation="vertical">
<Button
Android:id="@+id/button_click"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="40dp"
Android:text="Button Click"
Android:textSize="20sp" />
<TextView
Android:id="@+id/textview_click"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="40dp"
Android:text="TextView Click"
Android:textSize="20sp"
Android:background="#e4e4e4"
/>
</LinearLayout>
In Activity habe ich gerne Code
class MainActivity : AppCompatActivity() {
val TAG = "TAG"
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<LinearLayout>(R.id.linearlayout_root).setOnTouchListener { v, event ->
Log.i(TAG, "LinearLayout onTouch event " + getDisplayAction(event.action))
false
}
findViewById<Button>(R.id.button_click).setOnTouchListener { v, event ->
Log.i(TAG, "Button onTouch event " + getDisplayAction(event.action))
false
}
findViewById<TextView>(R.id.textview_click).setOnTouchListener { v, event ->
Log.i(TAG, "TextView onTouch event " + getDisplayAction(event.action))
false
}
}
private fun getDisplayAction(action: Int): String {
return when (action) {
MotionEvent.ACTION_DOWN -> "DOWN"
MotionEvent.ACTION_MOVE -> "MOVE"
MotionEvent.ACTION_UP -> "UP"
MotionEvent.ACTION_CANCEL -> "CANCEL"
MotionEvent.ACTION_OUTSIDE -> "OUTSIDE"
else -> "UNKNOWN"
}
}
}
Linear onTouch return **FALSE**
, Button onTouch return **FALSE**
, TextView onTouch return **FALSE**
Klick auf Button
I/TAG: Button onTouch eventDOWN
I/TAG: Button onTouch eventMOVE
I/TAG: Button onTouch eventUP
Klick auf TextView
TAG: TextView onTouch eventDOWN
TAG: LinearLayout onTouch eventDOWN
Klicken Sie auf LinearLayout
TAG: LinearLayout onTouch eventDOWN
Linear onTouch return **FALSE**
, Button onTouch return **TRUE**
, TextView onTouch return **TRUE**
Klick auf Button
Similar to case 1
Klick auf TextView
TAG: TextView onTouch event DOWN
TAG: TextView onTouch event MOVE
TAG: TextView onTouch event UP
Klicken Sie auf LinearLayout
Similar to case 1
Linear onTouch return **TRUE**
, Button onTouch return **FALSE**
, TextView onTouch return **FALSE**
Klick auf Button
Similar to case 1
Klick auf TextView
TAG: TextView onTouch event DOWN
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
Klicken Sie auf LinearLayout
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
TextView
ist not clickable
. Sie wird anklickbar, wenn Sie Android:clickable="true"
in xml ODER festlegen, wenn Sie textView.setOnClickListener(...)
einstellen.event MOVE
mehr als mein Protokoll aufrufen (abhängig davon, wie Sie tippen)onTouch
return true
oder view ist clickable
, view erhält allonTouchEvent
onTouch
return false
und view ist nicht clickable
, view empfängt nicht NEXT onTouchEvent (es wird möglicherweise übergeordnet)Ich hoffe es hilft
DEMO
Ich habe fast einen Tag bei der Fehlerbehebung verloren und fand immer noch heraus, dass meine onTouch-Funktion bei der Verwendung von true zweimal und bei der Verwendung von false zweimal aufgerufen wird.
Aus Android-Dokument:
Hinweis: Android ruft zuerst Ereignisbehandlungsroutinen und dann die entsprechenden Standardbehandlungsroutinen aus der Klassendefinition auf. Wenn Sie also true von diesen Ereignis-Listenern zurückgeben, wird die Weitergabe des Ereignisses an andere Ereignis-Listener gestoppt und der Rückruf an den Standard-Ereignishandler in der Ansicht blockiert. Stellen Sie daher sicher, dass Sie das Ereignis beenden möchten, wenn Sie true zurückgeben.