问题
在为滑动手势上的 ListView 项目开发某种“上下文操作”时,我对 Android 将 MotionEvents 分派给 ViewGroup 的孩子的方式有点困惑。
根据文档,所有事情都从ViewGroupd.dispatchTouchEvent(MotionEvent)
方法调用开始。然后视图组询问是否应该拦截特定的运动事件,或者我们可以将其分派给我们的孩子。这适用于各种滚动,因此我们可以有效地解决垂直和水平滚动之间的冲突(例如 ViewPager 中的 ListView)。
但是,我无法以这种方式成功处理列表视图中的简单单击事件。运动事件调度跟踪看起来像这样
ListView.dispatchTouchEvent(DOWN)
ListView.onInterceptTouchEvent(DOWN)
返回false
;QuickActionView.dispatchTouchEvent(DOWN)
QuickActionView.onTouchEvent(DOWN)
returntrue
因为 MotionEvent.ACTION_DOWN 表示手势的开始,它可能是水平滚动,在这种情况下我们应该向用户显示快速操作布局。如果我们false
从这里返回,MotionEvent.ACTION_DOWN
它会阻止其他触摸事件被分派给 ListView 的这个子项。- 由于第 4 步
QuickActionView.dispatchTouchEvent(DOWN)
返回true
- 由于第 5 步
ListView.dispatchTouchEvent(DOWN)
返回true
结果 ListView 记住了触摸目标。所以下一条消息是这样发送的。
ListView.dispatchTouchEvent(UP)
ListView.onInterceptTouchEvent(UP)
返回false
;QuickActionView.dispatchTouchEvent(UP)
QuickActionView.onTouchEvent(UP)
returnfalse
因为我们现在看到手势已经结束,它不是滚动或投掷或其他任何东西。- 由于第 4 步
QuickActionView.dispatchTouchEvent(UP)
返回false
- 由于第 5 步
ListView.dispatchTouchEvent(UP)
返回false
因此,ListView 没有机会处理项目点击,因为在步骤 5 之后使用 UP 操作,运动事件不会定向到 ListView 的onTouchEvent(MotionEvent)
方法。
我还尝试在 ListView 中使用 ACTION_UP “拦截”触摸事件,但注意到根据 Android 文档,拦截后只有进一步的运动事件将被定向到 ViewGroup 的onTouchEvent(MotionEvent)
方法,而当前的不会。
问题
如何同时支持 ListView 的本机项目单击处理和将 MotionEvents 分派到 ListItem 视图的能力(它是水平滚动的并具有图像按钮)?
最好听取在此类问题解决方面经验丰富的人的意见,或者对其设计如何与特定的冲突解决有更深入的了解