Intereting Posts
Попытка переопределить getView в SimpleCursorAdapter дает NullPointerExceptio AddTextChangedListener с listview с подтекстом Пейджер-подобное поведение в RecyclerView В чем разница между gnustl и stlport в разработке android ndk? Как настроить автоматический прирост первичного ключа в андроиде realm Тесты Travis CI для Android: нет подключенных устройств В чем разница между thread.sleep и systemclock.sleep. И какой из них следует использовать в AsyncTask? Как получить текущее время в собственном коде Android? Как сделать свой Android ContentObserver для ContactsContract обнаруженным добавленным, обновленным или удаленным контактом? Android: как использовать ValueAnimator Android Чтение текстового файла С SDcard более 5 Мб ошибки Что такое фокус звука в Android-классе AudioManager? Опубликовать файл aar в Maven Central с неработающей Gradle Можно ли использовать wifi cracking для телефонов Android? Режим монитора против многоадресной рассылки? Мое приложение прокручивается очень плохо после импорта шрифта roboto в папку «Ресурсы / шрифты»

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

Я использую ViewPager и WebView для представления содержимого HTML в виде книги. На некоторых страницах ViewPager я разрешаю TouchEvent обрабатывать WebView, и на некоторых страницах я позволяю ViewPager обрабатывать TouchEvent сам по себе, переопределяя метод onInterceptTouchEvent в ViewPager (некоторые страницы имеют TextViews и Buttons без WebView 1st И последняя страница здесь). Вот код для того же –

 @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 прокрутку, установив 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, где ViewPager содержит WebView, а Swiping доступен из любого места. Я не могу понять, как они это сделали.

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

Заранее спасибо за помощь.

Здесь вы идете человек – старая проблема с хорошим решением.

Посмотрите здесь. Прокрутите 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) 

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