WebView en ScrollView: "Ver demasiado grande para encajar en la caché de dibujo" – ¿cómo volver a trabajar el diseño?

Tengo un diseño con un ScrollView , que contiene las siguientes vistas: ImageView , TextView , WebView , TextView . (Esto es porque me gustaría desplazar el conjunto junto, no sólo el contenido de la WebView )

Después de cargar un poco de HTML en el WebView , recibo lo siguiente:

 WARN/View(632): View too large to fit into drawing cache, needs 14236800 bytes, only 1536000 available 

… y el contenido del WebView no se mostrará. Después de quitar el ScrollView , la advertencia desaparece y todo está bien, excepto que pierdo la funcionalidad de desplazamiento deseada.

Primero: sé que intentar usar un ScrollView dentro de otro ScrollView es algo malo en general , pero no estoy 100% seguro de que en todos los casos hay una solución equivalente sin usar ScrollView … Quiero decir, por supuesto, se podría poner Contenidos de ImageView s y TextView s en el WebView , pero ¿qué pasa con Button s o cualquier otro elemento de la interfaz de usuario que necesitan interacción? ¿Existe una manera en general que podría resolver problemas como este sin renunciar a la disposición y desplazamiento de todo a la vez?

He descubierto que no soy el único con este problema. Para otros ejemplos, compruebe esas preguntas – sin solución de trabajo todavía:

  • WebView y GridView en ScrollView, vista demasiado grande para caber en la memoria caché de dibujo
  • Android: vista demasiado grande para encajar en la caché de dibujo

El problema parece estar asociado con la aceleración de hardware que está habilitada por defecto si el nivel de API es> = 14.

Tengo una aplicación con un ScrollView que contiene una serie de vistas que quiero desplazar como una sola unidad similar al cartel original – una de esas vistas es una vista web que envuelve su contenido. Si la aceleración de hardware está WebView y la renderizada WebView es compleja (imágenes, bordes, etc.), el mensaje de error de caché de dibujo se puede ver en LogCat. Alguna pantalla con 12 artículos trabajó mientras que la pantalla siguiente con 13 artículos no trabajó. No creo que sea el número de elementos que marca la diferencia, sino la complejidad de la pantalla renderizada final.

Los síntomas suelen ser un WebView blanco – las otras vistas están visualmente presentes y formadas por completo. De vez en cuando veo toda la pantalla en blanco, pero que puede haber sido mientras yo estaba futzing con varias sugerencias encontradas aquí en SO.

El mensaje no siempre se ve. Por ejemplo, veo el problema en un Samsung Galaxy 4 Mini corriendo 4.2.2, mientras que en otros dispositivos 4.x como mi chino barato Samsung clon S3 corriendo 4.1.2 todo está bien. No lo he visto en ningún dispositivo 1.x o 2.x.

He intentado desactivar la aceleración de hardware en varias vistas y diseños en la jerarquía de vista, pero al final acaba de aceleración de hardware para toda la aplicación en el archivo de manifiesto de la frustración y ver cuántas horas he perdido el seguimiento de este abajo.

Después de desactivar la aceleración de hardware todos los problemas se han ido. No veo diferencias de rendimiento notables en ninguno de mis dispositivos. Presumiblemente, los dispositivos 1.x y 2.x nunca utilizaron aceleración de hardware en primer lugar, y mis dispositivos 4.x deben ser lo suficientemente rápidos para hacer frente a la renderización de software solamente. No es que mis pantallas sean tan complicadas.

Actualización ABRIL 2015

Por desgracia, el mensaje de advertencia está de vuelta en el Samsung Galaxy 4 Mini ahora en ejecución 4.4.2, incluso con la aceleración de hardware apagado. Tengo un webview con un panel de JavaScript abrir / cerrar la animación. Todo funciona bien, excepto que el diseño inicial (panel abierto) plantea estas advertencias, y cada vez que cierro o abrir el panel también los obtengo. Estas advertencias son ahora molesto, la aplicación funciona bien.

Como las otras respuestas indicadas, el problema aparece cuando la aceleración de hardware está activa. Pero desactivar la aceleración de hardware para toda la aplicación no era una solución para mí.

Pensé que podría resolver el problema mediante la configuración de android:layerType="software" para el ScrollView , que simplemente desactiva la aceleración de hardware para el ScrollView y su contenido.

 <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layerType="software"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> ... </FrameLayout> <WebView android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </ScrollView> 

Tenga en cuenta que esto puede tener implicaciones de rendimiento negativo, ya que la representación en el software suele ser más lenta.

webView.setLayerType(WebView.LAYER_TYPE_NONE, null);

Trabajado para mí. Dependiendo del hardware, no queda memoria para un búfer adicional fuera de la pantalla, ya que el WebView se representa enteramente cuando está incrustado en otra vista de desplazamiento.

Considero que es un error en Android que no se cae automáticamente a esta opción (más lenta, pero que funciona).

He creado algo similar y todo lo que necesitaba era añadir esto a mi WebView :

 android:layout_height="match_parent" 

Esto funciona para mí:

 <WebView android:id="@+id/wv" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="horizontal"/> 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.