1

I need to disable touchevent handling for a listview but allow it's children to receive clicks. I have a frame layout which has a mapview and the listview over it. When the list is empty, I want the map to handle all touch events but when the list is filled, I want the list items to receive clickevents.

4

1 回答 1

2

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

您在那里所做的是捕获 MotionEvent.ACTION_DOWN 事件并根据 ListView 是空的(触摸转到 MapView)还是填充并在 ListView 的边界内(触摸转到)来决定该事件是针对 ListView 还是 MapView到列表视图)。在这两种情况下都返回 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() 之间的交互是具有挑战性的,并且使其工作更是如此。但我相信这是解决您的问题的可行方法。

于 2013-02-25T04:02:36.247 回答