2013-02-25 114 views

回答

2

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

你在那裏做的是捕獲MotionEvent.ACTION_DOWN事件,並根據ListView是否爲空(觸摸到MapView)或填充並在邊界內決定事件是否適用於ListView或MapView ListView(觸及ListView)。 在這兩種情況下都返回true,並在onTouchEvent()(仍然是FrameLayout)中捕獲以下ACTION_DOWN事件。這樣,所有觸及ACTION_CANCEL的事件都將轉到您的FrameLayout的onTouchEvent()。

您的FrameLayout的onTouchEvent()將派發所有觸摸事件到ListView或MapView。 onInterceptTouchEvent()中已經採用了哪些視圖獲取事件的決定,因此您需要以某種方式存儲該決定的結果。該決定在ACTION_DOWN和ACTION_POINTER_UP,ACTION_UP,ACTION_CANCEL事件之間有效。

我不確定是否要禁用所有不選擇列表項目(拋出,滾動等)的非空ListView的觸摸事件?因爲這會使事情相當複雜。雖然我認爲從用戶的角度來看並不合適,因爲列表項不適合ListView的視口無法單擊,因爲您無法向上或向下滾動。

不要期望這很容易工作。理解運動事件的流程以及onInterceptTouchEvent()和onTouchEvent()之間的交互是非常具有挑戰性的,並使其更加有效。但我相信這是解決您的問題的可行方法。