用requestDisallowInterceptTouchEvent()方法防止viewpager和子view衝突
阿新 • • 發佈:2019-02-17
ViewPager來實現左右滑動切換tab,如果tab的某一項中嵌入了水平可滑動的View就會讓你有些不爽,比如想滑動tab項中的可水平滑動的控制元件,卻導致tab切換。
因為Android事件機制是從父View傳向子View的,可以去檢測你當前子View是不是在有可滑動控制元件等,決定事件是否攔截,但是這個比較麻煩,而且並不能解決所有的問題(必須檢測觸控點是否在這個控制元件上面),其實有比較簡單的方法,在你巢狀的控制元件中注入ViewPager例項(呼叫控制元件的getParent()方法),然後在onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent裡面告訴父View,也就是ViewPager不要攔截該控制元件上的觸控事件。
1 |
requestDisallowInterceptTouchEvent( true )
|
程式碼一般如下:
1 2 3 4 5 6 7 8 9 10 11 |
public
boolean onTouch(View v, MotionEvent event) {
switch
(event.getAction()) {
case
MotionEvent.ACTION_MOVE:
pager.requestDisallowInterceptTouchEvent( true );
break ;
case
MotionEvent.ACTION_UP: case
MotionEvent.ACTION_CANCEL:
pager.requestDisallowInterceptTouchEvent( false );
break ;
}
}
|
當用戶按下的時候,我們告訴父元件,不要攔截我的事件(這個時候子元件是可以正常響應事件的),拿起之後就會告訴父元件可以阻止。
ScrollView的原始碼中有比較詳細的程式碼,那個對觸控滑動的處理更精確一些,垂直滑動的時候,基本可以做到不會和viewpager衝突。
ViewGroup.onInterceptTouchEvent(MotionEvent) - 這允許一個檢視組ViewGroup 在分發給子檢視時觀察這些事件。ViewParent.requestDisallowInterceptTouchEvent(boolean)