2 ViewPager не прокручивается в Android 2.3

Я использую Navigation Drawer в своем приложении, который содержит некоторые фрагменты, как на рисунке ниже.

Введите описание изображения здесь

Каждый фрагмент содержит другой ViewPager, который является ImageSlider, а ниже – Listview, а наверху я использую SwipeRefreshLayout. Моя проблема заключается в том, что слайдер изображения хорошо работает на устройствах с Android версии 3.0 или выше, но салфетки влево или вправо не работают на устройствах 2.3 и ниже, вместо этого он вызывает салфетки Parent ViewPager, которые перемещают фрагмент. Для этой цели я использую библиотеку поддержки версии 4 для поддержки устройств ниже 3.0. Все функции работают достаточно хорошо на 2.3 устройствах, кроме одного. У меня есть googled, но я нигде не нашел никакой помощи. Поэтому, чтобы заставить его прокрутить, что я должен сделать для этого, любая идея / помощь будут высоко оценены.

Вы можете использовать этот ViewPager качестве родительского 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 не работает так хорошо. Решением здесь является расширение пейджера просмотра и переопределение 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); }