Android中Scrollview、ViewPager衝突問題彙總(已解決)
阿新 • • 發佈:2019-01-09
顯示問題:
1、設定ScrollView的fillViewPort為true
2、設定ViewPager的layout_height為一個固定高度,比如:100dip
衝突問題:
不過ViewPager顯示出來以後,還有另外一個衝突:ViewPager左右不能滑動了!是的,因為這個事件其實已經被外層的ScrollView截獲!
重寫ScrollView控制元件!
第一種解決方案:
重寫ScrollView,然後巢狀使用無任何問題,如何重寫,具體看以下地址
備註:ListView巢狀無法滑動也可以解決,listview佈局推薦線性佈局,相對佈局有小問題,如何解決請google
第二種方案:viewpager結合下拉重新整理元件,重寫Viewpager元件,如何重寫參考以下程式碼,
package com.bavariama.base.widget; import java.net.ContentHandler; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; /** * 此ViewPager解決與父容器ScrollView衝突的問題,無法完美解決.有卡頓 * 此自定義元件和下拉重新整理scrollview配合暫時小完美,有待改善 * @author bavariama * */ public class InsideViewPager extends ViewPager { float curX = 0f; float downX = 0f; OnSingleTouchListener onSingleTouchListener; public InsideViewPager(Context context) { // TODO Auto-generated constructor stub super(context); } public InsideViewPager(Context context, AttributeSet attrs) { // TODO Auto-generated constructor stub super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent ev) { curX = ev.getX(); // TODO Auto-generated method stub if (ev.getAction() == MotionEvent.ACTION_DOWN) { downX = curX; } int curIndex = getCurrentItem(); if (curIndex == 0) { if (downX <= curX) { getParent().requestDisallowInterceptTouchEvent(false); } else { getParent().requestDisallowInterceptTouchEvent(true); } } else if (curIndex == getAdapter().getCount() - 1) { if (downX >= curX) { getParent().requestDisallowInterceptTouchEvent(false); } else { getParent().requestDisallowInterceptTouchEvent(true); } } else { getParent().requestDisallowInterceptTouchEvent(true); } return super.onTouchEvent(ev); } public void onSingleTouch() { if (onSingleTouchListener != null) { onSingleTouchListener.onSingleTouch(); } } public interface OnSingleTouchListener { public void onSingleTouch(); } public void setOnSingleTouchListner( OnSingleTouchListener onSingleTouchListener) { this.onSingleTouchListener = onSingleTouchListener; } }