首先明确一点的是ViewPager是可以嵌套ViewPager的
最外层ViewPager控制主页面,简称为pOne
pOne的某一个子页面,或多个子页面嵌套的ViewPager ,简称为pSon
其实简单的嵌套,带来的问题主要是两点:
1.pOne与pSon的滑动监听控制
2.pOne与pSon的关联fragment的管理
解决办法也很简单:
1.在不做任何处理的情况下,在滑动页面时,只有当pSon滑动完所有页面,pOne才会继续滑动页面
如果想要只控制pSon的滑动,其实可以通过重写ViewPager,将pOne的滑动监听事件禁掉就可以了。
重写代码:
package com.hjk.shiny.weshop.overwrite;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* Created by Maibenben on 2017/12/7.
*/
public class CustomViewPager extends ViewPager{
//滑动开关控制常量
private boolean enable=false;
//重写构造
public CustomViewPager(Context context){
super(context);
}
//重写构造
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
//触碰事件
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(this.enable){
//开关打开,事件不进行拦截
return super.onTouchEvent(ev);
}
//默认拦截状态
return false;
}
//拦截事件监听
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(this.enable){
//开关打开,即处理拦截下来的touch事件
return super.onInterceptTouchEvent(ev);
}
//默认状态不处理来接下来的事件
return false ;
}
//传递触摸事件
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//处理事件的分发,将拦截到的事件分发到viewpager下的子view中去
//这个拦截了就没有后续事件发生了,到viewpager为止
//可以拦
if(this.enable){
return super.dispatchTouchEvent(ev);
}
//一般都不拦的
return super.dispatchTouchEvent(ev);
}
//留一个方法修改开关的开启关闭状态
public boolean setViewPagerState(Boolean b){
this.enable=b;
return this.enable;
}
}
注释很详细,就不多说了
2.关于fragment的管理。
由于pSon创建于pOne的fragment页面中,所以在获取自己的FragmentManager时,需要通过getChildFragmentManager()方法来获取,而不是像pOne在Activity中通过getSupportFragmentManager()或者getFragmentManager()来获取。通过FragmentPagerAdapter的继承子类适配器来适配pSon即可。
接下来再来谈一谈 依赖库 com.flyco.tablayout ,没用过或者不知道下载地址的话,可以通过这个链接去看看:
https://github.com/H07000223/FlycoTabLayout
东西是好东西,可惜在ViewPager与ViewPager的嵌套过程中起了冲突,在pOne中嵌套使用FlycoTabLayout
会使得pSon与pOne的FragmentManager出现线程混乱的问题,最终结果即导致线程奔溃报错。
解决办法:
使pOne与pSon处于伪嵌套关系,即pOne与pSon实际处理平行关系,在两个视图交接处通过Gone和Visible的切换,
实现视觉嵌套效果。
代码很简单,就不贴了,稍后会贴出整个应用的框架代码,即拿即用,往里填内容即可。