Android之viewPager嵌套viewPager無法滑動子viewPager


現在最頭疼的事就是需求不明確,這不,有遇到你個奇葩需求,父viewPager總共有三個選項卡,第一個選項卡里嵌入一個子viewPager,這時候問題就來了,子viewPager無法滑動,我猜的事父viewPager把子viewPager攔截了,於是嘗試了下面的第一種方法

1.重寫父viewPager的onInterceptTouchEvent方法

    /**
     * @author 子墨
     *
     * 2015-2-26上午8:59:50
     */
    public class MyViewPager extends ViewPager {
     
        public MyViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        
        @Override
        public boolean onInterceptTouchEvent(MotionEvent arg0) {
            return false;
        }
     
    }


當然方法很多,也可以嘗試重寫子viewPager

2.重寫子viewPager,通過getParent().requestDisallowInterceptTouchEvent(true)方法 通知父控件不攔截

    public class MyViewPager extends ViewPager {  
          
        public MyViewPager(Context context) {  
            super(context);  
        }  
      
        public MyViewPager(Context context, AttributeSet attrs) {  
            super(context, attrs);  
        }  
      
        PointF downPoint = new PointF();  
        OnSingleTouchListener onSingleTouchListener;  
      
        @Override  
        public boolean onTouchEvent(MotionEvent evt) {  
            switch (evt.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
                // 記錄按下時候的坐標  
                downPoint.x = evt.getX();  
                downPoint.y = evt.getY();  
                if (this.getChildCount() > 1) { //有內容,多於1個時  
                    // 通知其父控件,現在進行的是本控件的操作,不允許攔截  
                    getParent().requestDisallowInterceptTouchEvent(true);  
                }  
                break;  
            case MotionEvent.ACTION_MOVE:  
                if (this.getChildCount() > 1) { //有內容,多於1個時  
                    // 通知其父控件,現在進行的是本控件的操作,不允許攔截  
                    getParent().requestDisallowInterceptTouchEvent(true);  
                }  
                break;  
            case MotionEvent.ACTION_UP:  
                // 在up時判斷是否按下和松手的坐標為一個點  
                if (PointF.length(evt.getX() - downPoint.x, evt.getY()  
                        - downPoint.y) < (float) 5.0) {  
                    onSingleTouch(this);  
                    return true;  
                }  
                break;  
            }  
            return super.onTouchEvent(evt);  
        }  
      
        public void onSingleTouch(View v) {  
            if (onSingleTouchListener != null) {  
                onSingleTouchListener.onSingleTouch(v);  
            }  
        }  
      
        public interface OnSingleTouchListener {  
            public void onSingleTouch(View v);  
        }  
      
        public void setOnSingleTouchListener(  
                OnSingleTouchListener onSingleTouchListener) {  
            this.onSingleTouchListener = onSingleTouchListener;  
        }  
    }  

重寫子viewpager代碼摘自杭州山不高

其實上面的兩種方法更傾向於第一種,當然第二種也能解決問題,但是第二種會破壞事件分發的流程,直接告訴父控件不要攔截,我自己的是自己處理,總歸有些霸道,哈哈,不符合中庸之道


這樣寫能解決問題,但是體驗不好,最后還是放棄了,我只是分享我遇到的問題和解決方法,如果你有更好的方法,互相交流。
---------------------
作者:子墨_
來源:CSDN
原文:https://blog.csdn.net/ElinaVampire/article/details/43950613
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM