Android中事件处理方法返回的布尔值是什么意思
在android中,大多数事件侦听器方法都返回布尔值。该真/假值是什么意思?它将对后续事件产生什么影响Android中事件处理方法返回的布尔值是什么意思,android,events,touch,return,listener,Android,Events,Touch,Return,Listener,在android中,大多数事件侦听器方法都返回布尔值。该真/假值是什么意思?它将对后续事件产生什么影响 class MyTouchListener implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { logView.showEvent(event); return true; } } 关于上面的例子,如果在on
class MyTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
logView.showEvent(event);
return true;
}
}
关于上面的例子,如果在onTouch方法中返回true,我发现每个触摸事件(向下、向上、移动等)都已根据我的日志视图捕获。相反,如果return为false,则只捕获了一个DOWN事件。因此,看来返回false将阻止事件传播。我说得对吗
此外,在OnTestureListener中,许多方法也必须返回布尔值。它们有相同的含义吗?布尔值决定事件是否被消费 是的,你说得对。如果返回false,则下一个侦听器将处理该事件。如果返回true,则事件将由侦听器使用,而不会发送到下一个方法。来自文档:,android.view.MotionEvent) 如果侦听器已使用事件,则为True,否则为false
如果返回true,则会处理该事件。如果为false,它将转到下一层。如果您从
动作下的事件返回true
,则您对该手势中的其余事件感兴趣。在这种情况下,“手势”指的是直到最后一次操作启动
或操作取消
之前的所有事件。从操作向下返回false
,表示您不想要该事件,其他视图将有机会处理它。如果有重叠视图,则可以是同级视图。如果没有,它将冒泡到父级。我在故障排除中损失了将近一天,但我仍然发现,我的onTouch函数在使用true时调用了2次,在使用false时调用了1次。来自:
注意:Android将首先调用事件处理程序,然后从类定义中调用相应的默认处理程序。因此,从这些事件侦听器返回true将停止事件向其他事件侦听器的传播,并且还将阻止对视图中默认事件处理程序的回调。因此,请确保您希望在返回true时终止事件。以上所有答案都是正确的,但如果视图是可单击的,则结果不同
示例,我有一个线性布局
包含1个按钮
和1个文本视图
,如下所示
<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>
单击文本视图
TAG: TextView onTouch eventDOWN
TAG: LinearLayout onTouch eventDOWN
TAG: TextView onTouch event DOWN
TAG: TextView onTouch event MOVE
TAG: TextView onTouch event UP
TAG: TextView onTouch event DOWN
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
单击线性布局
TAG: LinearLayout onTouch eventDOWN
Similar to case 1
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
案例2线性返回**FALSE**
,按钮返回**TRUE**
,文本查看返回**TRUE**
点击按钮
I/TAG: Button onTouch eventDOWN
I/TAG: Button onTouch eventMOVE
I/TAG: Button onTouch eventUP
Similar to case 1
Similar to case 1
单击文本视图
TAG: TextView onTouch eventDOWN
TAG: LinearLayout onTouch eventDOWN
TAG: TextView onTouch event DOWN
TAG: TextView onTouch event MOVE
TAG: TextView onTouch event UP
TAG: TextView onTouch event DOWN
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
单击线性布局
TAG: LinearLayout onTouch eventDOWN
Similar to case 1
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
案例3线性点击返回**TRUE**
,点击返回**FALSE**
,文本查看点击返回**FALSE**
点击按钮
I/TAG: Button onTouch eventDOWN
I/TAG: Button onTouch eventMOVE
I/TAG: Button onTouch eventUP
Similar to case 1
Similar to case 1
单击文本视图
TAG: TextView onTouch eventDOWN
TAG: LinearLayout onTouch eventDOWN
TAG: TextView onTouch event DOWN
TAG: TextView onTouch event MOVE
TAG: TextView onTouch event UP
TAG: TextView onTouch event DOWN
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
单击线性布局
TAG: LinearLayout onTouch eventDOWN
Similar to case 1
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
注
TextView
的默认值是不可点击
,如果我们在xml中设置android:clickable=“true”
,或者在设置TextView.setOnClickListener(…)
时,它将变为可点击
- 调试时,
事件移动
可以调用多于我的日志(取决于点击方式)
总结
onTouch
返回true
或视图可单击
,视图将接收所有的
onTouchEvent
onTouch
返回false
且视图不可单击,视图将不接收下一个onTouchEvent(其父级可能会接收它)这是错误的
true
表示您已使用该事件,并希望手势中包含其余事件-其他侦听器/视图将不会接收该事件false
表示让其他人处理事件。事实上,它比这更具体一点;看我的答案。这怎么不完全是我说的?你说的正好相反。:)adamp,是否有办法保持接收事件并让事件通过?@ticofab否,只有当前接收事件的视图的父视图才能拦截手势中的未来事件。(当然,您始终可以在父视图中构建自己的重定向系统,但除非您真正了解自己在做什么,否则我不建议您这样做。:))@adamp我想不出为什么在返回true时会调用onTouch两次,在返回false时才调用onTouch一次。@adamp:我从ACTION\u DOWN返回false,但我的ACTION\u UP被触发并执行。是我得到了错误的答复还是其他人都。。。这个回复说返回true意味着不消耗艰难事件。但是事实完全相反。你能找出原因吗?检查事件。getAction()
,因为如果在ACTION\u DOWN事件上返回false
,则ACTION\u UP事件将被Listener忽略这应该是答案!谢谢你这么详细的解释