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 > 

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 entonces computeVerticalScrollRange() == getMeasuredHeight()
  • Cuando WebView tiene un contenido mayor que su altura (es desplazable) entonces computeVerticalScrollRange() > getMeasuredHeight()

Puede cambiar en 3 diseños:

  1. First TextView – encabezado
  2. WebView – diseño principal
  3. 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); 
  • Cómo hacer que mi proyecto sea compatible con diferentes versiones de sdk mientras utiliza funciones para una versión específica
  • Webview en Scrollview
  • React-nativo de Android WebView manejar clic en Url antes de cargar
  • Control HTML <select> desactivado en Android WebView (en el emulador)
  • Mostrar vídeo HTML5 en pantalla completa
  • Android detecta cambio de URL de webview
  • Android: el contenido de Flash rompe los límites de WebView y superpone elementos de diseño nativos
  • Señal 11 SIGSEGV Crash en Galaxy S3 Android WebView
  • Android: Hacer una vista Web DomStorage persistente después de cerrar la aplicación
  • Android WebView Facebook Login (problemas de pop-up / redirección)
  • ¿Cuál es el archivo html más grande que se puede cargar en un WebView de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.