带有WebView的ViewPager,允许滑动但禁止WebView滚动。

10

我正在使用 ViewPagerWebView 技术来展示 HTML 内容,制作成电子书。在 ViewPager 的某些页面中,我允许 TouchEvent 由 WebView 处理,而在另一些页面中,我通过覆盖 ViewPager 中的 onInterceptTouchEvent 方法,让 ViewPager 自己处理 TouchEvent(这里的某些页面只包含 TextViewsButtons,没有 WebView,例如第一页和最后一页)。以下是相关代码 -

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

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

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

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

这种行为类似于Gmail Android应用程序,其中ViewPager包含WebView并且可以从任何位置进行滑动。我无法弄清楚他们是如何做到的。

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

提前感谢帮助。


WebView 内显示的内容能否被缩放和滚动?或者滚动行为是否应该仅适用于 ViewPager - j2ko
滚动应该只能使用“ViewPager”启用。然而,缩放和其他行为,如长按文本选择,应该使用“WebView”启用。 - Sanjeet A
@Sanjeet Ajnabee,请分享带有演示数据的项目。至少包括ViewPager内容和WebView? - Anurag Singh
请添加适当的截图,以便我们更容易地理解您的问题并提供帮助。 - Maveňツ
3个回答

6

终于成功了。这真是太简单了。非常感谢你! - Sanjeet A
请将所引用链接中的答案部分添加到文本中,以便其他人可以获得答案。基本上,允许/禁止子视图滚动的部分解决了问题! - Sanjeet A

1

然而MarkySmarky非常有帮助,但我仍然想写出解决方案的部分,以便其他人可以得到帮助。

我通过重写该方法来解决问题

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

如果vWebView的实例,则返回false,以防止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);
    }
}

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

InterceptorViewpager 中移除,并使用默认的而不进行任何更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接