** 最近在研究一个有意思的功能,就是在Activity中使用ViewPager,在此ViewPager(1)中存放多个Fragment,在第一个Fragment中使用ViewPager(2),在这个ViewPager中在去存放多个Fragment。并且实现了每个ViewPager都用导航条!
首先如果你要(ˇ?ˇ) 想实现ViewPager的双层嵌套,那么你就的处理ViewPager之间的滑动冲突,这里涉及到一个知识点,叫做事件分发机制。
这个事件分发机制这里不做研究,有兴趣的可以百度或者查阅资料!我解决冲突的方式时自定义子Viewpager(2),通过重写该Viewpager的事件分发方法消除滑动冲突
**
//这里是我重写的代码
public class FirstBasePager extends ViewPager {
public FirstBasePager(Context context, AttributeSet attrs) {
super(context, attrs);
}
/** 触摸时按下的点 **/
PointF downpoint = new PointF();
/** 触摸的当前的点 **/
PointF curF = new PointF();
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (getChildCount() <= 1) {
return super.onTouchEvent(event);
}
curF.x = event.getX();
curF.y = event.getY();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
downpoint.x = event.getX();
downpoint.y = event.getY();
this.getParent().requestDisallowInterceptTouchEvent(true);
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
/**在第一页向后一页滑动*/
if (downpoint.x>=curF.x) {
if (getCurrentItem()==0||getCurrentItem()<getAdapter().getCount()-1) {
this.getParent().requestDisallowInterceptTouchEvent(true);
}
/**在最后一页*/ if(getCurrentItem()==getAdapter().getCount()-1){ this.getParent().requestDisallowInterceptTouchEvent(false);
}
}
/**在最后一页向前一页滑动*/
if (downpoint.x<=curF.x) {
if (getCurrentItem()<=getAdapter().getCount()-1) { this.getParent().requestDisallowInterceptTouchEvent(true);
}
/**在第一页*/
if (getCurrentItem()==0) { this.getParent().requestDisallowInterceptTouchEvent(false);
}
}
}
if (event.getAction() == MotionEvent.ACTION_UP
|| event.getAction() == MotionEvent.ACTION_CANCEL) {
if (downpoint.x == curF.x && downpoint.y == curF.y) {
/** 这是一个点击事件 */
return true;
} this.getParent().requestDisallowInterceptTouchEvent(true);
}
super.onTouchEvent(event);
return true;
}
}
注意在子ViewPager的布局中一定要使用这个自定义的Viewpager,为了解决Fragment在每次执行onCreateView方法导致第二次滑动到含有子Viewpager页面时,页面的内容消失问题需要在父Viewpager关联的Adapter中重写destroyItem方法
/**删除super的调用防止在滑动时销毁原来视图中的问题
* 删除super后不会出现第二次滑动到第一页时第一页的内容被销毁
* */
@Override
public void destroyItem(ViewGroup container, int position, Object object) { }