一.前面我们也说了,其实内容区的布局很简单,只是一个ViewPager。但是呢,又和普通的ViewPager有点不一样,普通的ViewPager是左右滑动的。这里我们要实现的效果是让ViewPager保持不动,通过左侧的滑动菜单来切换ViewPager的不同页面
实现效果如下:
二.
1.具体的布局(main_fragment_base.xml)
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.example.zhihudiary.view.NoInterceptViewPager
android:id="@+id/vp_base_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
里面只有一个ViewPager,但是是不动的ViewPager,这个我们需要自己去自定义
2)这里我们也新建一个包view,专门用来管理自定义的View
这个NoInterceptViewPager就是我们自定义的不会动的ViewPager (NoInterceptViewPager)
public class NoInterceptViewPager extends MyViewPager {
public NoInterceptViewPager(Context context) {
super(context);
// TODO自动生成的构造函数存根
}
public NoInterceptViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO自动生成的构造函数存根
}
/*
* 自己不拦截TouchEvent事件
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
// TODO自动生成的方法存根
return false;
}
/*
* 自己不处理TouchEvent事件
*/
@Override
public boolean nTouchEvent(MotionEvent arg0) {
// TODO自动生成的方法存根
return false;
}
}
3)但是你注意到没有,上面的NoInterceptViewPager没有继承ViewPager,而是继承MyViewPager? MyViewPager其实是低版本的ViewPager源码复制过来的,里面只改了一个成员变量的默认值,将其改为0。
private static final int DEFAULT_OFFSCREEN_PAGES = 0;
为什么要这么做呢?因为现在的ViewPager版本都有预加载机制,默认预加载一个页面。比如有3个页面,当前显示了页面1,会预加载页面2。好处是你滑倒第2个页面会很快显示出来。不好的地方是比如3个页面你只用到第1个第3个页面,但是第二个页面即使用不到也会预加载,比较费流量。
这里我们不想它预加载,所以就使用了这个MyViewPager。注意:只能复制低版本的ViewPager来修改这个默认值,高版本不可以。找不到的依旧可以去我上传的项目中找到这个文件,复制即可。
2.在MainFragment中的initView方法中加载这个布局 (MainFragment.java)
public class MainFragment extends BaseFragment {
private MyViewPager mViewPager;
@Override
protected View initView() {
// 加载布局
View root = View.inflate(mainActivity, R.layout.main_fragment_base, null);
// 拿到布局中的ViewPager组件
mViewPager = (MyViewPager)root.findViewById(R.id.vp_base_fragment);
return root;
}
}