ViewPager嵌套一个ViewPager典型的就是嵌套一个轮播图,但是在低版本的里层的ViewPager,是无法滑动的!
因为外层的ViewPager,会拦截触屏事件(TouchEvent)
通过重写里层控件的onTouchEvent方法,调用其父控件的requestDisallowInterceptTouchEvent()方法;使其父控件,不拦截触屏事件(TouchEvent),以此,便能达到里层的ViewPager,也能滑动的效果了。
package com.example.administrator.googleplay.views;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* 作者:Created by Kevin on 2016/2/1.
* 邮箱:haowei0708@163.com
* 描述:复写子ViewPager,解决在低版本下ViewPager嵌套的问题
*/
public class InnerViewPager extends ViewPager{
private float startX;
private float startY;
public InnerViewPager(Context context) {
super(context);
}
public InnerViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
startX = ev.getRawX();
startY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//判断是左右滑动还是上下滑动
float endX = ev.getRawX();
float endY = ev.getRawY();
if (Math.abs(endX - startX) > Math.abs(endY - startY) ){
//如果是左右滑动,请求父控件不要拦截自己的
getParent().requestDisallowInterceptTouchEvent(true);
}else {
//如果是上下滑动,拦截设置为false
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return super.onTouchEvent(ev);
}
}
遇到的错误:
犯了一个低级错误,没有加这个构造方法,导致在xml文件中不能使用
public InnerViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}