android中viewPager雙層嵌套問題,子viewpager無法滑動和滑動父級viewpager后子viewpager不顯示內容


android中viewPager雙層嵌套問題,子viewpager無法滑動和滑動父級viewpager后子viewpager不顯示內容
1.解決滑動父級viewpager到第三頁后,滑回第一頁后,第一頁的子viewpager不顯示內容?

解決辦法:只需要給父級viewpager設置這個屬性即可解決,viewPager.setOffscreenPageLimit(4);

原因:viewpager在滑動時,一般保存3個頁面,屏幕上顯示的和左右兩個,所以當你滑動父級viewpager到第三頁時,第一頁的viewpager已經被銷毀,所以當你滑回第一頁時,第一頁的子viewpager則不顯示內容。設置viewPager.setOffscreenPageLimit(4);屬性即表示,當viewpager滑動時,保存4個頁面,而不是3個頁面。說明父級的viewpager第一個頁面內容是保存的,不會被銷毀,當再滑回時,正常顯示內容。

 2.解決父級viewpager嵌套子viewpager后,子viewpager無法滑動?

解決辦法:自定義子viewpager,將下面的這個類放到程序當中,然后布局文件使用這個自定義的viewpager即可解決。
----------------------------------------------------------------------------------------------------------------------------------
public class ChildViewPager extends ViewPager{ 
    /** 觸摸時按下的點 **/ 
    PointF downP = new PointF(); 
    /** 觸摸時當前的點 **/ 
    PointF curP = new PointF(); 
    OnSingleTouchListener onSingleTouchListener; 
  
    public ChildViewPager(Context context, AttributeSet attrs) { 
        super(context, attrs); 
        // TODO Auto-generated constructor stub 
    } 
  
    public ChildViewPager(Context context) { 
        super(context); 
        // TODO Auto-generated constructor stub 
    } 
  
    @Override 
    public boolean onInterceptTouchEvent(MotionEvent arg0) { 
        // TODO Auto-generated method stub 
        //當攔截觸摸事件到達此位置的時候,返回true, 
        //說明將onTouch攔截在此控件,進而執行此控件的onTouchEvent 
        return true; 
    } 
  
    @Override 
    public boolean onTouchEvent(MotionEvent arg0) { 
        // TODO Auto-generated method stub 
        //每次進行onTouch事件都記錄當前的按下的坐標 
        curP.x = arg0.getX(); 
        curP.y = arg0.getY(); 
  
        if(arg0.getAction() == MotionEvent.ACTION_DOWN){ 
            //記錄按下時候的坐標 
            //切記不可用 downP = curP ,這樣在改變curP的時候,downP也會改變 
            downP.x = arg0.getX(); 
            downP.y = arg0.getY(); 
            //此句代碼是為了通知他的父ViewPager現在進行的是本控件的操作,不要對我的操作進行干擾 
            getParent().requestDisallowInterceptTouchEvent(true); 
        } 
  
        if(arg0.getAction() == MotionEvent.ACTION_MOVE){ 
            //此句代碼是為了通知他的父ViewPager現在進行的是本控件的操作,不要對我的操作進行干擾 
            getParent().requestDisallowInterceptTouchEvent(true); 
        } 
  
        if(arg0.getAction() == MotionEvent.ACTION_UP){ 
            //在up時判斷是否按下和松手的坐標為一個點 
            //如果是一個點,將執行點擊事件,這是我自己寫的點擊事件,而不是onclick 
            if(downP.x==curP.x && downP.y==curP.y){ 
                onSingleTouch(); 
                return true; 
            } 
        } 
  
        return super.onTouchEvent(arg0); 
    } 
  
        /**
     * 單擊
     */ 
    public void onSingleTouch() { 
        if (onSingleTouchListener!= null) { 
  
            onSingleTouchListener.onSingleTouch(); 
        } 
    } 
  
    /**
     * 創建點擊事件接口
     * @author wanpg
     *
     */ 
    public interface OnSingleTouchListener { 
        public void onSingleTouch(); 
    } 
  
    public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) { 
        this.onSingleTouchListener = onSingleTouchListener; 
    } 
  
}   
---------------------------------------------------------------------------------------------------------------------------------- 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com