简单网上书店网站建设php/十大小说网站排名
首先明确一点的是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);}//触碰事件@Overridepublic boolean onTouchEvent(MotionEvent ev) {if(this.enable){//开关打开,事件不进行拦截return super.onTouchEvent(ev);}//默认拦截状态return false;}//拦截事件监听@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {if(this.enable){//开关打开,即处理拦截下来的touch事件return super.onInterceptTouchEvent(ev);}//默认状态不处理来接下来的事件return false ;}//传递触摸事件@Overridepublic 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的切换,
实现视觉嵌套效果。
代码很简单,就不贴了,稍后会贴出整个应用的框架代码,即拿即用,往里填内容即可。