我需要为列表视图禁用touchevent处理,但允许其子级接收点击次数。我有一个框架布局,它有一个mapview和listview。当列表为空时,我希望地图处理所有触摸事件,但是当列表填满时,我希望列表项接收clickevents。
答案 0 :(得分: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 (触摸转到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()之间的交互是具有挑战性的,并使其更加有效。但我相信这是解决问题的可行方法。