2014-01-16 76 views
3

我知道有這樣的問題已經有答案,但我沒有任何運氣,所以這是最後的手段。如何防止Android ScrollView攔截其父母單擊事件

我有一個包含ScrollView的LinearLayout。我希望LinearLayout響應點擊,點擊,觸摸任何你想調用它,但滾動視圖干擾,所以LinearLayout的點擊處理程序從不調用。我不介意子類ScrollView和重寫onTouchEvent(但我不明白該怎麼放入它),但另一種解決方案也很好。我已經嘗試在LinearLayout,ScrollView和ScrollView的第一個孩子上使用requestDisallowInterceptTouch(true),但它不起作用(TBH,該方法的javadoc使我感到困惑)。

如果我在自定義的滾動視圖使用此覆蓋:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return false; 
} 

...的LinearLayout中沒有迴應水龍頭,但滾動被完全禁用,並在LinearLayout中單擊處理所有類型的觸摸手勢的結果是調用。那麼,我需要做些什麼來讓滾動動作像平時一樣處理,並且還可以讓ScrollView忽略點擊/點擊?

對於它的價值,在XML看起來是這樣的:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/my_layout" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <TextView 
     .../> 

    <com.package.MyScrollView 
     android:id="@+id/my_scroller" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:fillViewport="true" 
     android:scrollbars="vertical"> 
    ... 
    ... 

在正常情況下,TextView的面積將檢測與LinearLayout中註冊的點擊,但滾動型不會。

回答

0

嘗試將ScrollView的focusable屬性設置爲false。

<ScrollView 
    android:focusable="false" 
    > 
    <!-- other stuff--> 
</ScrollView> 
+0

它沒有工作,也沒有focusableintouchmode =「false」 – RTF

2

首先,requestDisallowInterceptTouch(true)不幸的是你想要達到的目的完全相反。它會強制所有父母ViewGroup,包括您在其中調用該方法以忽略在onInterceptTouchEvent()中傳遞給他們的事件的父母。

通常情況下,是沒有設置這個標誌設置爲true,新的觸摸事件首先從根傳遞到葉一路向下視圖樹,其允許父母(即ViewGroups),以通過返回true攔截這些事件被重定向所有跟在這個ViewGroup的s onTouchEvent()方法的手勢的事件之後。在到達查看樹葉之後(假設沒有人返回trueonInterceptTouchEvent()中),事件通過onTouchEvent()方法回到根。再次返回true意味着事件在視圖中消耗,所有進一步的事件將直接傳遞給您的onTouchEvent()方法,而不是遍歷整個視圖樹。所以onInterceptTouch()onTouch()之間的區別是遍歷通過視圖樹的方向 - 讀一切,我真的不知道,如果它比的Javadoc更易於理解^^

儘管如此,把長話短說: requestDisallowInterceptTouchEvent(true)在這裏沒有解決方案。

這是爲了序言。還在?你真幸運 - 因爲有一個(有點醜陋)的解決方法爲你所觀察到的情況:把OnClickListenerScrollView孩子,讓它在你的LinearLayout應該做的伎倆performClick()。這將保持ScrollView處於工作狀態(與嘗試覆蓋onTouch不同),但會將所有點擊事件(僅限那些)傳遞到外部LinearLayout

相關問題