在viewpager中嵌套fragment再嵌套viewpager的事件分发问题解决
2016-10-25 08:35
483 查看
在现在的应用中经常能碰到在activity中,一个viewpager+tab然后pager内嵌套fragment再内嵌viewpager+fragment,在组合多样化的同时也带来了一些问题。
此问题的解决办法是,重写子pager,为子pager添加自己的点击事件。
解决办法:在touch事件中记录点击的坐标,在move事件中通过x轴坐标计算判断滑动的方向和是否在最后一页时继续左划或者在第一页时继续右划。添加了配置总页数的方法
以下为重写的子viewpager的代码
再配上自己重写的FragmentPagerAdapter
嵌套情况下pager的事件分发
在实际应用中我最开始使用的是v4包的viewpager,测试发现的问题是,当我操作内层pager的时候,只能滑动一点点距离然后触摸事件马上被外层pager抢走,内层根本无法滑动切换页面。此问题的解决办法是,重写子pager,为子pager添加自己的点击事件。
嵌套情况下子pager滑到边缘的事件分发条件
只添加了点击事件修改了调用之后,内层pager可以滑动了,但是当内层pager滑到边缘的时候,我继续滑动,想要再把事件分发给外层pager来操作。解决办法:在touch事件中记录点击的坐标,在move事件中通过x轴坐标计算判断滑动的方向和是否在最后一页时继续左划或者在第一页时继续右划。添加了配置总页数的方法
以下为重写的子viewpager的代码
public class ChildViewPager extends ViewPager{ /** 触摸时按下坐标 **/ PointF downP = new PointF(); /** 触摸时当前坐标 **/ PointF curP = new PointF(); OnSingleTouchListener onSingleTouchListener; /** 当前pager的总页数 **/ int listCount; public ChildViewPager(Context context, AttributeSet attrs) { super(context, attrs); } public ChildViewPager(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { //在此位置返回true,将事件拦截在子pager中 return true; } //添加总页数记录,在给pager配置adapter时要调用此方法把总页数添加进来 public void setListSize(int size){ listCount = size; } //获取总页数 public int getFragmentCount(){ return listCount; } @Override public boolean onTouchEvent(MotionEvent arg0) { //每次onTouch事件触发时都记录当前按下的坐标 curP.x = arg0.getX(); curP.y = arg0.getY(); if(arg0.getAction() == MotionEvent.ACTION_DOWN){ //记录按下时候的坐标 downP.x = arg0.getX(); downP.y = arg0.getY(); //此句代码是避免父pager对操作进行干扰 getParent().requestDisallowInterceptTouchEvent(true); } if(arg0.getAction() == MotionEvent.ACTION_MOVE){ //判断是否是在第一个页面继续右划或者是否在最后一个页面时继续左划 //如果是,把事件给到父级pager if(getCurrentItem()==getFragmentCount()-1&&downP.x-curP.x>0||getCurrentItem()==0&&downP.x-curP.x<0){ getParent().requestDisallowInterceptTouchEvent(false); }else{ getParent().requestDisallowInterceptTouchEvent(true); } } if(arg0.getAction() == MotionEvent.ACTION_UP){ //在此时判断按下和松手是否在同一位置 //如果是,执行自己写的点击事件 if(downP.x==curP.x && downP.y==curP.y){ onSingleTouch(); return true; } } return super.onTouchEvent(arg0); } //点击事件 public void onSingleTouch() { if (onSingleTouchListener!= null) { onSingleTouchListener.onSingleTouch(); } } //创建点击事件接口 public interface OnSingleTouchListener { public void onSingleTouch(); } public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) { this.onSingleTouchListener = onSingleTouchListener; } }
再配上自己重写的FragmentPagerAdapter
public class MyFragmentPagerAdapter extends FragmentPagerAdapter{ private List<Fragment> fragments = new ArrayList<Fragment>(); public void addFragment(Fragment fragment){ if(fragment!=null){ this.fragments.add(fragment); } } public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int arg0) { return fragments.get(arg0); } @Override public int getCount() { return fragments.size(); } }
相关文章推荐
- 在viewpager中嵌套fragment再嵌套viewpager的事件分发问题解决
- 解决ViewPager嵌套Fragment内部点击事件无响应问题
- 解决双ViewPager嵌套的事件分发和去掉viewpager滑动问题
- 解决ViewPager嵌套Fragment内部点击事件无响应问题
- 解决fragment中嵌套viewpager,vierpager中有多个fragment,不显示的问题
- [置顶] 解决ViewPager嵌套时Fragment的mUserVisibleHint属性不同步的问题
- [置顶] 滚动嵌套viewpager,里面的fragment高度问题(已解决)
- Activity中包含多个Fragment,Afragment中嵌套ViewPager,在第二次切换到Afragment时Viewpager内容被清空的问题解决
- 解决android FragmentTabHost + viewpager + fragment 嵌套布局切换出现白屏什么都没有问题
- 解决小米系统下ViewPager、ScrollView内嵌套WebView时,Touch事件不响应的问题
- 解决ViewPager中嵌套ViewPager的滑动分发问题
- fragment里面嵌套ViewPager,解决切换fragment了之后ViewPager中的内容消失的问题
- 解决ViewPager嵌套时Fragment的mUserVisibleHint属性不同步的问题
- 解决viewpager嵌套viewpager fragment不显示问题
- 解决ViewPager嵌套时Fragment的mUserVisibleHint属性不同步的问题
- 解决ScrollView嵌套viewpager滑动事件冲突问题
- 关于解决多个viewpager嵌套所遇到的事件传递问题
- 解决ScrollView嵌套viewPager中嵌套listView滑动事件冲突问题(水平方向)
- 解决网友 ViewPager嵌套Fragment 回退问题
- Android之ViewPager中包含ViewFlipper时实现双滑动嵌套解决父控件干扰问题