Что означает логическое значение, возвращаемое из метода обработки события в 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 ответов:
если вы возвращаете
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
содержится 1Button
и 1TextView
такой<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.