Ответ 1
Здесь вы идете человек - старая проблема с хорошим решением.
Посмотрите здесь Прокрутите веб-просмотр по горизонтали внутри ViewPager
Я использую 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
, он также отключает выбор длинного клика и текста, что нежелательно.
Заранее благодарим за помощь.
Здесь вы идете человек - старая проблема с хорошим решением.
Посмотрите здесь Прокрутите веб-просмотр по горизонтали внутри ViewPager
Вы создали 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
и используйте значение по умолчанию без изменений
Однако 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);
}
}