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); 
  • Agregar una vista de pie de página nativa a la vista web
  • WebView con vídeo incorporado reproduce en segundo plano
  • Fuga de memoria de WebView de Android al utilizar activos
  • Vista web de Android con geolocalización de HTML 5
  • Android detecta cambio de URL de webview
  • Inyección de Javascript en la vista web
  • Fling Gesture y Webview en Android
  • Android WebView enlaces a la misma ventana con destino = _blank para abrir una nueva ventana
  • Webview dentro de RecyclerView está mostrando pantalla en blanco a veces en los dispositivos de turrón solamente
  • Simular la vista Web de Android en Firefox de la PC?
  • Android 4.4 dando ERR_CACHE_MISS error en onReceivedError para WebView volver
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.