ViewPager con WebView que permite pasar y no permitir el desplazamiento de WebView
Estoy utilizando ViewPager
y WebView
para presentar el contenido HTML
como un libro electrónico. En algunas páginas del ViewPager estoy permitiendo que el TouchEvent
sea manejado por el WebView y en algunas páginas estoy permitiendo que el ViewPager maneje el TouchEvent
por sí mismo reemplazando el método onInterceptTouchEvent
en el ViewPager
(algunas páginas están teniendo TextViews
y Buttons
sin WebView
1st Y la última página aquí). Aquí está el código para el mismo –
@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; } }
Estoy desautorizando nuevamente el desplazamiento fijando OnTouchListener
en el WebView
usando el siguiente código-
- Sincronizar la altura de la barra de herramientas con ViewPager
- ¿Existe una manera de crear un control deslizante de vista previa en android
- ¿Cómo puedo implementar la vista de cabecera + deslizar la pestaña del buscapersonas + ver paginador como la aplicación de lujo?
- ViewPager + SurfaceView = retraso largo al volver a la actividad
- Transición de RecyclerView a ViewPager
contentView.setOnTouchListener((v, event) -> { if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_MOVE) { ((BigBeeViewPager) v.getParent().getParent()).onInterceptTouchEvent(event); } return true; });
Problema que estoy enfrentando es – Cuando estoy tratando de deslizar el ViewPager desde el centro de las páginas que no funciona. Tengo que empezar a filtrar desde el final de las páginas. Sin embargo, funciona bien para las páginas que no tienen WebView
¿Cómo permitir que comience a pasar desde el lugar en las páginas.
Este comportamiento es similar a la aplicación de Android de Gmail donde ViewPager
contiene el WebView y Swiping está disponible desde cualquier lugar. No soy capaz de averiguar cómo lo han hecho.
Nota – Cuando estoy interceptando todos los TouchEvent
para el WebView
también deshabilita el clic largo y la selección de texto, lo cual no es deseable.
Gracias de antemano por la ayuda.
- Problema de envoltura de contenido de Indicador TabPage de Android
- Android PagerTabStrip - Eliminar espaciado
- No se puede emitir a la clase ViewPager personalizada
- Mostrando imágenes con efecto carrusel en android
- Android View Pager se equivoca
- ViewPager + reciclar las vistas?
- Tutorial para implementar el uso de TabHost en Android 2.2 + ViewPager y Fragmentos
- Cambio de la pestaña Default en la pestaña de la página del cajón de navegación
Aquí tienes hombre – un viejo problema con una buena solución.
Echa un vistazo aquí Scroll webview horizontalmente dentro de un ViewPager
Tienes que crear un GestureDetector
e implementarlo en una Webview
como esta:
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; } });
Y eliminar el Interceptor
de Viewpager
y utilizar el predeterminado sin ningún cambio
Sin embargo MarkySmarky es extremadamente útil para encontrar la solución, pero todavía me gustaría escribir la parte de respuesta para que otras personas pueden obtener ayuda.
Resolví el problema reemplazando el método
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y)
De ViewPager
y devolver false
si v
es la instancia de WebView
. Esto no es permitir que el desplazamiento de WebView
sí mismo y, por tanto, ViewPager
tratarlo como un niño que no se desplaza y, por tanto, el deslizamiento de obras desde cualquier lugar de la página.
Finalmente mi ViewPager
está pareciendo-
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); } }