【问题标题】:Android OnTouchEvent and onclick eventAndroid OnTouchEvent 和 onclick 事件
【发布时间】:2016-10-04 14:43:40
【问题描述】:
我正在开发一个应用程序,其中包含几个片段,如下图所示:
Picture 1
底部视图为MainActivity,MainActivity上方有几个片段,其中可能包含按钮。我想在顶部添加一个片段以侦听OnTouchEvents(手势),但忽略onclick 事件并将onclick 事件传递给下面的片段。
这是我的问题,
- 如何区分代码中的
onTouchEvent 和onclick 事件?
- 如何将
onclick 事件传递给下面的片段?
我看到有人建议使用onInterceptTouchEvent(),但我不确定这是否适用于我的情况,我不太了解如何使用onInterceptTouchEvent()。
更新:
我试图覆盖boolean dispatchTouchEvent(MotionEvent ev)让顶部片段忽略点击事件,但是由于第一个触摸事件必须是MotionEvent.ACTION_DOWN,所以我似乎无法确定触摸事件是否为点击。
那么,有没有其他方法可以做到这一点?
【问题讨论】:
标签:
android
android-studio
android-fragments
android-touch-event
【解决方案1】:
来自Documentation
只要在 ViewGroup 的表面(包括其子项的表面)上检测到触摸事件,就会调用 onInterceptTouchEvent() 方法。 如果 onInterceptTouchEvent() 返回 true,则 MotionEvent 被拦截,这意味着它不会传递给子节点,而是传递给父节点的 onTouchEvent() 方法。
onInterceptTouchEvent() 方法使父级有机会在其子级之前看到任何触摸事件。如果您从 onInterceptTouchEvent() 返回 true,则之前处理触摸事件的子视图会收到一个 ACTION_CANCEL,并且从该点开始的事件将被发送到父视图的 onTouchEvent() 方法进行常规处理。 onInterceptTouchEvent() 也可以返回 false 并在事件沿视图层次结构向下移动到通常的目标时简单地监视事件,这些目标将使用自己的 onTouchEvent() 处理事件。
因此,您必须根据您的应用程序流逻辑返回真/假(在 onInterceptTouchEvent 方法中)。如果您使用 OnTouchListener,您可以避免使用 OnClickListener。请参阅文档中的示例以更好地理解它。
【解决方案2】:
This 会让您了解 onTouch 和 onClick 的不同之处。
您可以使用自定义接口将数据传递给较低的片段进行操作