it-swarm.com.ru

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

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

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

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

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

99
John Wang

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

127
adamp

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

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

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

22
Matthieu

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

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

11
Falmarri

Все вышеприведенные ответы верны, но результат будет другим, если представление является 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, представление получит allonTouchEvent
  • onTouch return false и представление не является clickable, представление не получит NEXT onTouchEvent (его родитель может получить его)

Надеюсь, это поможет
ДЕМО

2
Linh

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

1
kamor

Из Android-документ

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

0
Brasc elok