9

아래 그림과 같은 일부 조각이 포함 된 내 응용 프로그램에서 내비게이션 서랍을 사용하고 있습니다.2 ViewPager가 안드로이드 2.3에서 스크롤되지 않습니다.

enter image description here

모든 조각은 ImageSlider 또 다른 ViewPager를 포함하고, 그 아래에 목록보기이며, 상단에 나는 SwipeRefreshLayout을 사용하고 있습니다. 내 문제는 이미지 슬라이더가 Android 버전 3.0 이상인 기기에서 제대로 작동하지만 왼쪽 또는 오른쪽 스 와이프가 기기 2.3 이하에서는 작동하지 않고 조각을 탐색하는 상위 ViewPager의 스 와이프를 호출한다는 것입니다. 이 3.0 버전보다 낮은 장치를 지원하기 위해 지원 버전 4 라이브러리를 사용하고 있습니다. 모든 기능은 2.3 장치를 제외하고 2.3 장치에서 잘 작동합니다. 나는 그것을 봤지만 아무 도움도 찾지 못했습니다. 그래서 이것을 위해 무엇을해야할지 스크롤하게하려면, 어떤 아이디어/도움을 주시면 감사하겠습니다.

+2

는 코드를 넣어! – Techfist

+0

그 버그를 알고 있습니다. 'HorizontalScrollView' 또는'RecyclerView'를 사용하면 같은 문제가 발생합니다. 일반적으로 스크롤 할 수있는 것보다 아래로 스 와이프하면 기능이 그대로 남아 있습니다. – rekire

+0

swipeRefresh 레이아웃을 사용하고 있으므로이 메서드를 호출하면됩니다. –

답변

1

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

희망이 있습니다!

0

Android의 이전 버전에서는 requestDisallowInterceptTouchEvent가 그렇게 작동하지 않습니다. 여기서 해결 방법은보기 호출기를 확장하고 onInterceptTouchEvent를 무시하고 스크롤 할 수있는 하위 목록을 저장하는 것입니다. 그런 다음 onInterceptTouchEvent가 호출 될 때 스크롤 가능한 자식 목록을 반복하고, hit rect를 가져오고, touch 이벤트가 hit rect 내에 있는지 확인합니다. 그것이 맞다면, 당신은 단지 그것을 다루지 않기 위해 거짓을 돌려 주어 아이가 그것을 가져 가게 할 수 있습니다. 이 같은

뭔가 :

@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); 
} 
관련 문제