Android WebView dentro de ScrollView solo desplaza scrollview
En mi aplicación tengo un ScrollView que contiene algunas linearviews, algunas vistas de texto y One Webview, luego otros diseños lineales, etc. El problema es que el WebView no se desplaza. El Scroll sólo escucha en ScrollView. ¿¿Alguna sugerencia??
<ScrollView > <TextView /> <WebView /> <-- this does not scroll <TextView /> </ScrollView >
- Cómo interceptar datos POST en una vista web de android
- La fuente del recurso no se carga en android webView
- Cómo enviar datos POST con código en una vista web de Android
- Android Webview: No se puede llamar a determinedVisibility () - nunca vio una conexión para el pid
- Textarea no envuelve texto en WebView en Android
- Obtener la altura del contenido de WebView una vez que su Android cargado
- Inserte instagram en Android WebView
- Appium: ¿Cómo obtener la WEB_VIEW de la aplicación híbrida basada en iónicos?
- Cómo cargar una página web externa dentro de WebView
- Uncaught ReferenceError, Llamando función javascript a través de la aplicación android ..?
- Android - forma simple de entrada de usuario web-view para back-end java con jQuery Mobile
- Android - Añadir GestureDetector a la vista web
- Múltiples instancias de webview destacadas vistas en dispositivos cromados al abrir y cerrar la aplicación android de Córdoba
Aquí está la solución. Encontrado en línea. He subclasificado WebView y estoy usando el requestDisallowInterceptTouchEvent(true);
Para permitir que mi webview maneje el evento de desplazamiento.
TouchyWebView.java
package com.mypackage.common.custom.android.widgets public class TouchyWebView extends WebView { public TouchyWebView(Context context) { super(context); } public TouchyWebView(Context context, AttributeSet attrs) { super(context, attrs); } public TouchyWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent event){ requestDisallowInterceptTouchEvent(true); return super.onTouchEvent(event); } }
Y en layout.xml
<com.mypackage.common.custom.android.widgets.TouchyWebView android:id="@+id/description_web" android:layout_width="match_parent" android:layout_height="wrap_content" />
La solución proporcionada por @panos funciona pero todavía tiene problemas cuando se utiliza con ScrollView. La siguiente versión mejorada supera ese problema.
public class TouchyWebView extends WebView { public TouchyWebView(Context context) { super(context); } public TouchyWebView(Context context, AttributeSet attrs) { super(context, attrs); } public TouchyWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent event) { //Check is required to prevent crash if (MotionEventCompat.findPointerIndex(event, 0) == -1) { return super.onTouchEvent(event); } if (event.getPointerCount() >= 2) { requestDisallowInterceptTouchEvent(true); } else { requestDisallowInterceptTouchEvent(false); } return super.onTouchEvent(event); } @Override protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); requestDisallowInterceptTouchEvent(true); } }
Además, es posible que desee tener las siguientes opciones para su TouchyWebView.
mWebView.getSettings().setLoadWithOverviewMode(true); mWebView.getSettings().setUseWideViewPort(true); mWebView.getSettings().setSupportZoom(true); mWebView.getSettings().setBuiltInZoomControls(true);
Panos es suficiente para mí con una excepción … Mi WebView
altura fija (200dp) puede estar vacía o puede haber cargado mucho contenido. Por lo tanto, puede ser o no ser desplazable "sí mismo". La solución de Panos está consumiendo siempre MotionEvent
, así que cuando WebView
está vacío y el usuario toque WebView
y trate de desplazarse, entonces WebView
no se desplazará (porque no hay contenido) y desplazable padre también, causa WebView
"traga" MotionEvent
. He añadido una instrucción small if
para el comportamiento esperado:
@Override public boolean onTouchEvent(MotionEvent event) { if(computeVerticalScrollRange() > getMeasuredHeight()) requestDisallowInterceptTouchEvent(true); return super.onTouchEvent(event); }
- Cuando
WebView
está vacío y no vertical-desplazable entoncescomputeVerticalScrollRange() == getMeasuredHeight()
- Cuando
WebView
tiene un contenido mayor que su altura (es desplazable) entoncescomputeVerticalScrollRange() > getMeasuredHeight()
Puede cambiar en 3 diseños:
- First TextView – encabezado
- WebView – diseño principal
- Second TextView – pie de página
WebView web = (WebView) findViewById(R.id.webView); View header = getLayoutInflater().inflate(R.layout.header_layout, null); View footer = getLayoutInflater().inflate(R.layout.foorer_layout, null); web.addHeaderView(headerComment); web.addFooterView(footerComment);
- Configurar android EditText para permitir decimales y negativos
- ¿Qué licencia (s) son las librerías de soporte de Android lanzadas bajo?