在 Android 中,从事件处理方法返回的布尔值的含义是什么

在 android 中,大多数事件侦听器方法返回一个布尔值。真/假值是什么意思?它将导致什么后续事件?

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

关于上面的例子,如果返回真在 OnTouch方法,我发现每个触摸事件(向下,向上,移动等)已经根据我的 LogView捕获。相反,如果返回 false,只有 DOWN 事件被捕获。所以似乎返回 false 会阻止事件的传播。我说的对吗?

此外,在 OnGestureListener中,许多方法也必须返回一个布尔值。它们有相同的含义吗?

46290 次浏览

布尔值确定是否使用事件。

是的,你说得对。如果返回 false,则下一个侦听器将处理该事件。如果返回 true,则事件将被侦听器使用,而不会发送到下一个方法。

来自文档: http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.View,android.view. MotionEvent)

“如果侦听器已使用该事件,则为 True,否则为 false。”

如果返回 true,事件将被处理。如果返回 false,事件将进入下一层。

如果你从一个 ACTION_DOWN事件返回 true,你对这个姿态中的其他事件感兴趣。“手势”在这种情况下意味着所有的事件,直到最后的 ACTION_UPACTION_CANCEL。从 ACTION_DOWN返回 false意味着您不想要事件,其他视图将有机会处理它。如果您有重叠的视图,这可以是一个兄弟视图。如果没有,就会浮现在父母面前。

I lost nearly one day in troubleshooting, still i found out, that my onTouch function is called 2 times when using true and 1 times when using false.

来自 译自: 美国《科学》杂志网站(http://developer.android.com/guide/subject/ui/ui-events. html)原文地址: http://developer.android.com/guide/subject/ui-events. html:

注意: Android 将首先调用事件处理程序,然后从类定义调用适当的默认处理程序。因此,从这些事件侦听器返回 true 将停止事件向其他事件侦听器的传播,并且还将阻止对视图中的默认事件处理程序的回调。因此,确保要在返回 true 时终止事件。

以上答案都是正确的,但是结果是不同的,如果视图是 clickable或不是 clickable

示例 ,我有一个包含1个 Button和1个 TextViewLinearLayout,如下所示

<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, I have code like

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

Click on Button

Similar to case 1

点击 TextView

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

Click on LinearLayout

Similar to case 1

Case 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

注意

  • Default of TextView is not clickable, it will become clickable if we set android:clickable="true" in xml 或者 when we set textView.setOnClickListener(...)
  • 当您调试时,event MOVE可以调用多于我的日志(它取决于您如何点击)

摘要

  • 返回 true或查看是 clickable ,查看将收到 所有 onTouchEvent
  • onTouch return false and view is not clickable, view will 不接收下一个 onTouchEvent (it's parent may receive it)

希望能有帮助
演示