viewpager跟HorizontalScrollView,listview衝突的問題
阿新 • • 發佈:2018-12-30
這幾天做到一個小qpp,發現一個嚴重的問題,因為主要佈局是一個HorizontalScrollView裡面裝了個viewpager包含fragment,恰好我有又想實現一個側邊欄,所以發現app執行之後,側滑欄雖然能夠滑動,但是viewpager完全不能用了,不能滑動,就連tablelayout按鈕都不能用了,就上網查詢了下資料,原來是viewpager和HorizontalScrollView衝突了,HorizontalScrollView裡面viewpager的活動被HorizontalScrollView父view攔截了,所以我們為了能夠實現兩者的協調,必須分情況到底父view是否該攔截子view的活動。攔截了側滑欄就能活動,不攔截viewpager就能活動。
getParent().requestDisallowInterceptTouchEvent(true);把touch主動權交給子view處理,不攔截touch事件,也就是viewpager
getParent().requestDisallowInterceptTouchEvent(flse);把touch主動權交給父view處理,攔截touch事件,也就是HorizontalScrollView
具體程式碼如下:
在今後使用中只需要使用上述程式碼然後在layout佈局檔案中使用package com.example.a1.myapplication.View; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; public class ChildViewPager extends ViewPager { public ChildViewPager(Context context, AttributeSet attrs) { super(context, attrs); } public ChildViewPager(Context context) { super(context); } // 滑動距離及座標 歸還父控制元件焦點 private float xDistance, yDistance, xLast, yLast,xDown, mLeft; @Override public boolean dispatchTouchEvent(MotionEvent ev) { //把touch主動權交給子view處理,不攔截touch事件,也就是viewpager getParent().requestDisallowInterceptTouchEvent(true); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = yDistance = 0f; xLast = ev.getX(); yLast = ev.getY(); xDown = ev.getX(); mLeft = ev.getX(); // 解決與側邊欄滑動衝突 break; case MotionEvent.ACTION_MOVE: final float curX = ev.getX(); final float curY = ev.getY(); xDistance += Math.abs(curX - xLast); yDistance += Math.abs(curY - yLast); xLast = curX; yLast = curY; if (mLeft < 100 || xDistance < yDistance) { getParent().requestDisallowInterceptTouchEvent(false); } else { if (getCurrentItem() == 0) { if (curX < xDown) { getParent().requestDisallowInterceptTouchEvent(true); } else { getParent().requestDisallowInterceptTouchEvent(false); } } else if (getCurrentItem() == (getAdapter().getCount()-1)) { if (curX > xDown) { getParent().requestDisallowInterceptTouchEvent(true); } else { getParent().requestDisallowInterceptTouchEvent(false); } } else { getParent().requestDisallowInterceptTouchEvent(true); } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: break; } return super.dispatchTouchEvent(ev); } }
<com.hk.View.ChildViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</com.hk.ChildViewPager>
然後就ok了,而且你覺得想實現側滑欄實現的簡單點,可以刪除一些上面程式碼的東東西,當然listview也是同樣的道理,相信大神的你們都會領悟。