Что означает логическое значение, возвращаемое методом обработки событий в Android - PullRequest
105 голосов
/ 21 сентября 2010

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

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

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

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

Ответы [ 6 ]

133 голосов
/ 21 сентября 2010

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

22 голосов
/ 21 сентября 2010

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

«Истина, если слушатель использовал событие, иначе ложь».

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

11 голосов
/ 21 сентября 2010

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

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

2 голосов
/ 16 августа 2018

Все приведенные выше ответы верны, но результат будет другим, если вид равен 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>

В Activity у меня есть код вроде

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

1 голос
/ 14 июня 2013

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

0 голосов
/ 26 февраля 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...