2017-03-01 3 views
10

ViewPagerWebView을 사용하여 HTML 콘텐츠를 eBook으로 표시합니다. ViewPager의 일부 페이지에 나는 1 WebView없이 TextViewsButtons을 가지고있는 TouchEvent는 웹보기에서 일부 페이지 나는 ViewPager (일부 페이지에 onInterceptTouchEvent 방법을 재정 의하여 ViewPager가 자체적으로 TouchEvent을 처리시키고있다에 처리 할 수 ​​있도록하고있다 마지막 페이지는 여기). 여기에 내가 직면하고있는 다음과 같은 코드 -WebView를 사용하는 ViewPager로 WebView의 스 와이프 및 스크롤을 허용하지 않음

contentView.setOnTouchListener((v, event) -> { 
      if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_MOVE) { 
       ((BigBeeViewPager) v.getParent().getParent()).onInterceptTouchEvent(event); 
      } 
      return true; 
     }); 

문제를 사용하여 WebViewOnTouchListener을 설정하여 같

@Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     if (getCurrentItem() == 0 || getCurrentItem() == getAdapter().getCount() - 1) 
      return false; 
     else { 
      if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
       return false; 
      } 
      return true; 
     } 
    } 

내가 다시 스크롤을 허용하지 오전에 대한 코드 것은입니다 - 내가 노력하고 때 ViewPager를 페이지 중간에서 스 와이프하면 작동하지 않습니다. 페이지 끝에서부터 시작해야합니다. 그러나 그것은 가지고 있지 않은 페이지에 대해 잘 작동합니다. WebView 페이지의 아무 곳에서나 스 와이프를 시작하는 방법.

이 동작은 과 유사합니다. Gmail Android 앱ViewPager에는 WebView가 포함되어 있으며 어디에서나 스 와이프를 사용할 수 있습니다. 나는 그들이 그것을 한 방법을 알아낼 수 없다.

주 - 내가 바람직하지 않은, 너무 긴 클릭하고 텍스트 선택을 비활성화 WebView 모든 TouchEvent을 차단하고 있습니다.

도움을 미리 감사드립니다.

+0

이 안에 표시하는 콘텐츠 수 같은 -는'확대 및 스크롤 WebView' 찾고?아니면 스크롤 동작은'ViewPager'에만 적용되어야합니까? – j2ko

+0

'ViewPager'를 사용하여 스크롤링을 사용하도록 설정해야합니다. 그러나 'WebView'를 사용하면 확대/축소 및 긴 클릭과 같은 텍스트 선택이 가능해야합니다. –

+0

@Sanjeet Ajnabee 프로젝트를 데모 데이터로 공유하십시오. 뷰 페이지 콘텐츠 및 웹뷰에서 적어도? –

답변

2

멋진 해결책을 가진 오래된 문제입니다.

하기가 GestureDetector를 생성하고이 같은 Webview에 그 구현이 Scroll webview horizontally inside a ViewPager

+0

마지막으로 작업했습니다. 그거 쉽지. 정말 고맙습니다! –

+0

다른 사람이 답변을 얻을 수 있도록 참조 된 링크에서 답변 부분을 추가하십시오. 기본적으로 하위보기로 스크롤하는 것을 허용/금지하는 부분이 문제를 해결합니다! –

0

여기를보세요 :

GestureDetector gestureDetector=new GestureDetector(new GestureDetector.OnGestureListener() { 
     @Override 
     public boolean onDown(MotionEvent motionEvent) { 
      return false; 
     } 

     @Override 
     public void onShowPress(MotionEvent motionEvent) { 
     } 

     @Override 
     public boolean onSingleTapUp(MotionEvent motionEvent) { 
      return false; 
     } 

     @Override 
     public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { 
      return false; 
     } 

     @Override 
     public void onLongPress(MotionEvent motionEvent) { 
     } 

     @Override 
     public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { 
      return false; 
     } 
    }); 

      webView.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        switch (event.getAction()) { 
         case MotionEvent.ACTION_DOWN: 
         case MotionEvent.ACTION_UP: 
          if (!v.hasFocus()) { 
           v.requestFocus(); 
          } 
          break; 
        } 
        gestureDetector.onTouchEvent(event); 
        return false; 
       } 
      }); 

을 그리고 Viewpager에서 Interceptor을 제거하고 변경없이 기본 하나를 사용

+0

나는 이것을 시험해 보았다. –

0

그러나 MarkySmarky은 솔루션을 찾는 데 매우 유용하지만 여전히 응답 파트를 작성하고 싶습니다. r 사람들은 도움을 얻을 수 있습니다.

나는 방법을 ViewPager

protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) 

을 무시하고 WebView의 인스턴스 인 경우 falsev 반환함으로써이 문제를 해결했다. 이것은 WebView 자체를 스크롤시키지 않으므로 ViewPager은 그것을 nono 스크롤 자식으로 취급하므로 페이지의 아무 곳에서나 작동합니다.

마지막으로 내 ViewPager

public class BigBeeViewPager extends ViewPager { 

    public BigBeeViewPager(Context context) { 
     super(context); 
    } 

    public BigBeeViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { 
     return !(v instanceof ObservableWebView) && super.canScroll(v, checkV, dx, x, y); 
    } 
}