【问题标题】:How to disable ListView touch events? Allow only childview clicks如何禁用 ListView 触摸事件?只允许子视图点击
【发布时间】:2013-02-25 03:23:46
【问题描述】:

我需要禁用列表视图的触摸事件处理,但允许它的子视图接收点击。我有一个框架布局,上面有一个地图视图和列表视图。当列表为空时,我希望地图处理所有触摸事件,但当列表被填满时,我希望列表项接收点击事件。

【问题讨论】:

    标签: android listview event-handling


    【解决方案1】:

    您可以使用 onInterceptTouchEvent() 拦截自定义 FrameLayout(您的根 ViewGroup)中的所有触摸事件:http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)

    您所做的是捕获 MotionEvent.ACTION_DOWN 事件并根据 ListView 是空的(触摸到 MapView)还是填充并在 ListView 的边界内决定该事件是针对 ListView 还是 MapView (触摸转到 ListView)。 在这两种情况下都返回 true 并在 onTouchEvent() 中捕获以下 ACTION_DOWN 事件(仍然是 FrameLayout)。这样,直到 ACTION_CANCEL 的所有触摸事件都将转到 FrameLayout 的 onTouchEvent()。

    FrameLayout 的 onTouchEvent() 会将所有触摸事件分派给 ListView 或 MapView。在 onInterceptTouchEvent() 中决定了哪些视图获取事件,因此您需要以某种方式存储该决定的结果。该决定在 ACTION_DOWN 和 ACTION_POINTER_UP、ACTION_UP、ACTION_CANCEL 事件之间有效。

    我不确定您是否要禁用未选择列表项的非空 ListView 的所有触摸事件(翻动、滚动等)?因为这会使事情变得相当复杂。虽然我认为从用户的角度来看这没有意义,因为无法单击不适合 ListView 视口的列表项,因为您无法向上或向下滚动。

    不要指望这很容易。了解运动事件的流程以及 onInterceptTouchEvent() 和 onTouchEvent() 之间的交互是具有挑战性的,并且使其工作更是如此。但我相信这是解决您问题的可行方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多