使用WebView的ViewPager允许滑动和禁止滚动WebView

时间:2017-03-01 08:15:49

标签: android webview android-viewpager android-webview

我正在使用ViewPagerWebViewHTML内容呈现为电子书。在ViewPager的某些页面上,我允许WebView处理TouchEvent,在某些页面上,我让ViewPager通过覆盖TouchEvent方法来处理onInterceptTouchEventViewPager(某些网页上有TextViewsButtons没有WebView第1页和最后一页。这是相同的代码 -

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

我再次通过使用以下代码在OnTouchListener上设置WebView来禁止滚动 -

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

我面临的问题是 - 当我尝试从页面中间滑动ViewPager时,它无法正常工作。我必须从页面末尾开始滑动。但是对于没有WebView的页面,它可以正常工作 如何允许它从页面中的任何位置开始滑动。

此行为类似于 Gmail Android App ,其中ViewPager包含WebView,并且可以从任何位置使用Swiping。我无法弄清楚他们是如何做到的。

注意 - 当我拦截所有TouchEventWebView时,它也会禁用长按和文本选择,这是不可取的。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

在这里你走人 - 一个很好的解决方案的老问题。

看看Scroll webview horizontally inside a ViewPager

答案 1 :(得分:1)

然而MarkySmarky对于找出解决方案非常有帮助,但我仍然想写下答案部分,以便其他人可以获得帮助。

我通过覆盖方法

解决了这个问题
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y)
ViewPager

,如果falsev的实例,则返回WebView。这不是让WebView滚动本身,因此ViewPager将其视为非滚动子项,因此可以从页面的任何位置进行滑动。

最后我的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);
    }
}

答案 2 :(得分:0)

您已创建GestureDetector并在Webview上执行此操作:

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

Interceptor中移除Viewpager并使用默认值而不做任何更改