9

Tôi đang sử dụng Ngăn điều hướng trong ứng dụng của mình, có chứa một số Fragments giống như trong hình bên dưới.2 ViewPager không cuộn trong Android 2.3

enter image description here

Mỗi Fragment Có khác ViewPager đó là một ImageSlider, và dưới đó là một listview và ở phía trên Tôi đang sử dụng SwipeRefreshLayout. Vấn đề của tôi là thanh trượt hình ảnh hoạt động tốt trên các thiết bị có phiên bản Android 3.0 trở lên nhưng vuốt sang trái hoặc sang phải không hoạt động trên các thiết bị 2.3 trở xuống, thay vào đó nó sẽ vuốt vuốt của Parent ViewPager để điều hướng đoạn. Tôi đang sử dụng thư viện hỗ trợ Phiên bản 4 cho mục đích này để hỗ trợ các thiết bị thấp hơn 3.0. Tất cả các chức năng hoạt động khá tốt trên 2,3 thiết bị ngoại trừ một thiết bị. Tôi đã googled nó nhưng tôi đã không tìm thấy bất kỳ sự giúp đỡ bất cứ nơi nào. Vì vậy, để làm cho nó cuộn những gì tôi nên làm gì cho điều này, bất kỳ ý tưởng/trợ giúp sẽ được đánh giá cao.

+2

đặt mã của bạn !! – Techfist

+0

Tôi biết lỗi đó. Bạn có cùng một vấn đề nếu bạn sử dụng một 'HorizontalScrollView' hoặc' RecyclerView'. Nói chung chức năng vẫn còn đó nếu bạn vuốt xuống hơn bạn có thể cuộn. – rekire

+0

Vì tôi đang sử dụng bố cục swipeRefresh nên kéo xuống sẽ gọi phương thức này. –

Trả lời

1

Bạn có thể sử dụng số ViewPager làm cha mẹ ViewPager. Điều này cho phép con ViewPager cuộn.

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; 
     } 
    } 
} 

Trang web dành cho nhà phát triển Android có giải thích tốt về xử lý sự kiện chạm trong Viewgroup. Bạn có thể tham khảo tại đây: http://developer.android.com/training/gestures/viewgroup.html

Hy vọng điều đó sẽ hữu ích !!

0

Trong phiên bản cũ hơn của yêu cầu AndroidDisallowInterceptTouchEvent không hoạt động tuyệt vời. Giải pháp ở đây là mở rộng trình xem trang và ghi đè onInterceptTouchEvent và lưu trữ danh sách các trẻ em có thể cuộn được. Sau đó, khi onInterceptTouchEvent được gọi là bạn có thể lặp qua danh sách các trẻ em có thể cuộn, nhận được hit của họ rect, và xem nếu các sự kiện cảm ứng là bên trong hit rect. Nếu có, bạn chỉ có thể trả về sai để không xử lý nó và để cho đứa trẻ mang nó.

Something như thế này:

@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); 
} 
Các vấn đề liên quan