2 ViewPager不能在Android 2.3中滚动

我在我的应用程序中使用导航抽屉,其中包含一些碎片,就像下面的图片。

在这里输入图像说明

每个片段包含另一个ViewPager是一个ImageSlider,下面是一个ListView,在顶部我使用SwipeRefreshLayout。 我的问题是图像滑块适用于Android版本3.0或更高版本的设备,但向左或向右滑动不能在设备2.3和更低版本上运行,而是调用父ViewPager的滑动,即导航片段。 为此,我正在使用支持第4版的库来支持低于3.0的设备。 所有function在2.3设备上运行良好,除了一个。 我GOOGLE了,但我没有find任何帮助。 所以为了让它滚动,我应该为此做什么,任何想法/帮助将不胜感激。

Related of "2 ViewPager不能在Android 2.3中滚动"

您可以使用此ViewPager作为您的父ViewPager 。 这允许子ViewPager滚动。

 public class CustomViewPager extends ViewPager { public CustomViewPager(Context context) { super(context); } public CustomViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { try { //Handle the issue only in lower versions of android if (v != this && v instanceof ViewPager && CJRAppCommonUtility.getOSVersion() < android.os.Build.VERSION_CODES.HONEYCOMB) { ViewPager viewPager = (ViewPager) v; int currentPage = viewPager.getCurrentItem(); int size = viewPager.getAdapter().getCount(); //if ViewPager has reached its end and if user tries to swipe left allow the parent to scroll if (currentPage == (size - 1) && dx < 0) { return false; } //if ViewPager has reached its start and if user tries to swipe right allow the parent to scroll else if (currentPage == 0 && dx > 0) { return false; } //Allow the child to scroll hence blocking parent scroll else { return true; } } return super.canScroll(v, checkV, dx, x, y); } catch (Exception e) { e.printStackTrace(); return false; } } } 

Android开发人员网站对处理Viewgroup触摸事件有一个很好的解释。 你可以在这里参考: http : //developer.android.com/training/gestures/viewgroup.html

希望能帮助到你!!

在较旧版本的Android请求中,DisallowInterceptTouchEvent不起作用。 这里的解决scheme是扩展视图分页器并覆盖onInterceptTouchEvent并存储可滚动的子项列表。 然后,当onInterceptTouchEvent被调用时,你可以遍历可滚动子表的列表,得到它们的命中矩,看看触摸事件是否在命中矩。 如果是这样,你可以返回false来处理它,让孩子拿走它。

像这样的东西:

 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { for (View view : scrollableChildren) { // get the hit rectangle for the view Rect rect = new Rect(); view.getHitRect(rect); // check to see if the click was inside this child if (rect.contains((int) ev.getX(), (int) ev.getY())) { return false; } } return super.onInterceptTouchEvent(ev); }