ViewPager с WebView, позволяющий прокручивать и запрещать прокрутку WebView

Я использую ViewPager и WebView для представления содержимого HTML в качестве книги. На некоторых страницах ViewPager я разрешаю TouchEvent обрабатывать WebView и на некоторых страницах я позволяю ViewPager обрабатывать TouchEvent самостоятельно, переопределяя метод onInterceptTouchEvent в ViewPager (некоторые страницы имеют TextViews и Buttons без 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 Как разрешить ему начать прокрутку из любого места на страницах.

Такое поведение похоже на приложение для Android Gmail, где ViewPager содержит WebView и Swiping доступен из любого места. Я не могу понять, как они это сделали.

Примечание.. Когда я перехватываю все TouchEvent в WebView, он также отключает выбор длинного клика и текста, что нежелательно.

Заранее благодарим за помощь.

Ответ 2

Вы создали 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 и используйте значение по умолчанию без изменений

Ответ 3

Однако MarkySmarky чрезвычайно полезно найти решение, но все же я хотел бы написать часть ответа, чтобы другие люди могли получить помощь.

Я решил проблему, переопределив метод

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

of ViewPager и возвращает false, если v является экземпляром 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);
    }
}