2011-03-23 79 views
1

我有一個FiewFlipper有ListViews作爲子。我已經找到了一種方法,在到達孩子之前攔截GestureDetector的觸摸事件 - 一種通過ViewFlipper全局攔截觸摸事件的方法。ViewFlipper通過手勢切換ListViews通過手勢

擴展FiewFlipper並執行onInterceptTouchEvent (MotionEvent ev)似乎是解決方案。這對大多數孩子來說效果很好。但是,當列表視圖開始滾動時,onInterceptTouchEvent停止接收事件。

我知道可以設置每個列表視圖的OnTouchListener,但是這個遺蹟簡直就是我試圖創建的層次結構。

+3

你試圖壓制的行爲是故意的,你可能不應該試圖與它作鬥爭。 ListView在開始滾動時調用方法requestDisallowInterceptTouchEvent(true),從而防止觸摸事件派發在該視圖的祖先上調用onInterceptTouchEvent。它這樣做是爲了在用戶嘗試滾動時不會中斷粗糙的滾動手勢。 – adamp 2011-03-23 23:49:14

+0

您需要從'onInterceptTouchEvent'返回'true'來將觸發事件從'ListView'重定向到您自己的組件(即在攔截時除了決定是否重定向事件外,實際上應該做任何事情)。一旦用戶將手指向左/右移動太遠,就可以做到這一點。這樣你就不會同時有兩個組件同時作用於觸摸事件。 – 2011-05-15 18:57:46

+0

查看這個類的示例實現http://www.jmstudio.org/ - 它也有拖動。 – 2011-05-15 18:58:16

回答

0

正如adamp所評論的那樣,這種行爲是有意的,不需要被打。我將手勢監聽器應用於子元素。

0

嗯。我曾經有一個單一列表視圖的活動,我在那裏重新填充適配器作爲一舉一動的手勢。我做到了通過實現活動的dispatchTouchEvent方法:

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    super.dispatchTouchEvent(ev); 
    return gestureDetector.onTouchEvent(ev); 
} 

ListView控件仍接收到常態的事件,但我gestureDectector了品嚐他們。也許類似的方法會適合你?

+0

如果處理事件,則應始終返回true。你的例子可能應該這樣做:'boolean handled = super.dispatchTouchEvent(ev); handling | = gestureDetector.onTouchEvent(ev);返回處理;'這也不是推薦的方法來跟蹤這樣的事情,你應該真的使用'onInterceptTouchEvent'。正如我在對問題的評論中所描述的那樣,所描述的行爲是有意的。 – adamp 2011-03-23 23:53:39