Что означает логическое значение, возвращаемое из метода обработки события в Android


в android большинство методов прослушивателя событий возвращают логическое значение. Что означает это значение true / false ? к чему это приведет в последующих событиях ?

class MyTouchListener implements OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        logView.showEvent(event);
        return true;
    }
}

относительно приведенного выше примера, если вернуть true в onTouch метод, я обнаружил, что каждое событие касания (вниз, вверх, перемещение и т. д.) было захвачено в соответствии с моим logView. Наоборот,если вернуть false, а события, были захвачены. Так это гостиничную систему, которая вернет значение false предотвратит событие распространяться. Я прав ?

кроме того, в OnGestureListener, многие методы также должны возвращать логическое значение. Имеют ли они одно и то же значение ?

6 96

6 ответов:

если вы возвращаете true с ACTION_DOWN событие вас интересуют остальные события в этот жест. А "жест" в данном случае означает все события вплоть до финала ACTION_UP или ACTION_CANCEL. Возвращение false С ACTION_DOWN означает, что вы не хотите, чтобы событие и другие представления будут иметь возможность обрабатывать его. Если у вас есть перекрывающиеся виды, это может быть одноуровневый вид. Если нет, то он будет пузыриться до родителя.

из документации : http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.View-андроид.вид.MotionEvent)

"True, если прослушиватель использовал событие, false в противном случае."

Если вы возвращаете true, событие обрабатывается. Если false, он перейдет на следующий слой вниз.

логическое значение, которое определяет, является ли событие потребляется или нет.

Да, вы правы. Если вы возвращаете false, следующий прослушиватель обрабатывает событие. Если он возвращает true, событие потребляется вашим слушателем и не отправляется в следующий метод.

Я потерял почти один день в устранении неполадок, но все же я узнал, что моя функция onTouch вызывается 2 раза при использовании true и 1 раз при использовании false.

все выше ответ правильный, но результат отличается, если вид clickable или clickable

пример, у меня есть LinearLayout содержится 1 Button и 1 TextView такой

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

в деятельности, у меня есть код, как

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

корпус 1 Linear onTouch return **FALSE**,Button onTouch return **FALSE**,TextView onTouch return **FALSE**

нажать на кнопку

I/TAG: Button onTouch eventDOWN
I/TAG: Button onTouch eventMOVE
I/TAG: Button onTouch eventUP

нажмите на TextView

TAG: TextView onTouch eventDOWN
TAG: LinearLayout onTouch eventDOWN

нажмите на LinearLayout

TAG: LinearLayout onTouch eventDOWN

корпус 2 Linear onTouch return **FALSE**,Button onTouch return **TRUE**,TextView onTouch return **TRUE**

нажать на кнопку

Similar to case 1

нажмите на TextView

TAG: TextView onTouch event DOWN
TAG: TextView onTouch event MOVE
TAG: TextView onTouch event UP

нажмите на LinearLayout

Similar to case 1

корпус 3 Linear onTouch return **TRUE**,Button onTouch return **FALSE**,TextView onTouch return **FALSE**

нажмите на Кнопка

Similar to case 1

нажмите на TextView

TAG: TextView onTouch event DOWN
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP

нажмите на LinearLayout

TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP

Примечание

  • по умолчанию TextView и not clickable, он станет кликабельным, если мы установим android:clickable="true" в xml или когда мы ставим textView.setOnClickListener(...)
  • при отладке, event MOVE может вызвать больше, чем мой журнал (он основан на том, как вы коснитесь)

резюме

  • onTouch возвращение true или представления clickable , Вид получит всеonTouchEvent
  • onTouch возвращение false и не clickable, вид не получить следующий onTouchEvent (это родитель может получить его)

надеюсь, что это поможет
DEMO

с Android-документ:

Примечание: Android сначала вызовет обработчики событий, а затем соответствующие обработчики по умолчанию из определения класса во-вторых. Таким образом, возврат true из этих прослушивателей событий остановит распространение события на другие прослушиватели событий, а также заблокирует обратный вызов обработчика событий по умолчанию в представлении. Поэтому убедитесь, что вы хотите завершить событие, когда вы возвращаете true.