webentwicklung-frage-antwort-db.com.de

Was bedeutet boolescher Wert, der von einer Ereignisbehandlungsmethode in Android zurückgegeben wird?

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?

99
John Wang

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.

127
adamp

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.

22
Matthieu

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.

11
Falmarri

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

Fall 1 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

Fall 2 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

Fall 3 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

Hinweis

  • Die Voreinstellung von TextView ist not clickable. Sie wird anklickbar, wenn Sie Android:clickable="true" in xml ODER festlegen, wenn Sie textView.setOnClickListener(...) einstellen.
  • Beim Debuggen kann event MOVE mehr als mein Protokoll aufrufen (abhängig davon, wie Sie tippen)

Zusammenfassung

  • 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

2
Linh

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.

1
kamor

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.

0
Brasc elok