【问题标题】:ListView parent view cannot intercept touch eventsListView父视图无法拦截触摸事件
【发布时间】:2014-01-08 03:15:20
【问题描述】:

我有一个简单的布局:

<CustomFrameLayout>
    <ListView />
</CustomFrameLayout>

在我的 CustomFrameLayout 中,我正在覆盖:

onInterceptTouchEvent(MotionEvent event);

并返回 false。滚动 ListView 时,onInterceptTouchEvent 接收 ACTION_DOWN 和第一个 ACTION_MOVE 事件。然后,ListView 似乎接管了,onInterceptTouchEvent 无法接收到以下 ACTION_MOVE 事件。

这违背了文档的规定:

只要您从此函数返回 false,每个后续事件(直到并包括最终的 up)都将首先在这里传递,然后再传递到目标的 onTouchEvent()。

http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)

我已经研究过请求在 ListView 级别不被拦截的触摸事件。

requestDisallowInterceptTouchEvent(boolean disallowIntercept)

这似乎没有任何效果。我也应该在 ListView 单元格视图上调用它吗?还有什么我想念的吗?我正在 Android 4.4 上进行测试

谢谢。

【问题讨论】:

    标签: android listview motionevent


    【解决方案1】:

    你应该在onInterceptTouchEvent(MotionEvent event);中返回true

    true 表示您愿意接收进一步的触摸动作,而false 表示您不感兴趣进一步的动作...

    【讨论】:

    • 这会阻止 ListView 接收事件。我想简单地监听事件而不消耗它们。因此我需要返回false。从 onInterceptTouchEvent 的文档中读取第 3 点。
    • 然后您可以手动将触摸事件从您的 CustomFrameLayout 发送到 ListView...
    • 这是一个选项。我很乐观地认为还有其他事情可以做,或者我错过了一些事情。我已更新问题以包含文档所述的内容。我想要的行为在文档中明确说明。
    【解决方案2】:

    我决定改用这个方法。在这里,我可以保证我可以在所有触摸事件被分派到子视图并可能被子视图消费之前拦截它们。

    dispatchTouchEvents(MotionEvent event);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多