WebView in ScrollView: "Guarda troppo grande per adattarsi alla cache di disegno" – come rielaborare il layout?

Ho un layout con uno ScrollView , che contiene le seguenti viste: ImageView , TextView , WebView , TextView . (Questo perché vorrei scorrere insieme tutto, non solo il contenuto del WebView )

Dopo aver caricato alcuni HTML nel WebView , riceverò quanto segue:

  • Ottieni la frequenza di un file audio in each 1/4 secondi in android
  • Come scrivere un text su un'image in Java (Android)
  • Limitazioni di thread Android AsyncTask?
  • Spugna di Gradle: ignorare da pacchetto
  • Come scoprire se ListView ha scorciato la parte superiore della posizione?
  • Android: Come funziona con il thread di background?
  •  WARN/View(632): View too large to fit into drawing cache, needs 14236800 bytes, only 1536000 available 

    … e il contenuto di WebView non verrà visualizzato. Dopo aver rimosso lo ScrollView , l'avviso scompare e tutto va bene, tranne che perderò la funzionalità di scorrimento desiderata.

    In primo luogo: so che cercando di utilizzare uno ScrollView all'interno di un altro ScrollView è una cosa negativa in generale , ma non sono al 100% sicuro che in each caso esista una soluzione equivalente senza utilizzare ScrollView … Voglio dire, ovviamente si potrebbe mettere i contenuti di ImageView e TextView s nel WebView , ma cosa su Button s o altri elementi dell'interface utente che necessitano di interazione? C'è un modo in generale che potrebbe risolvere problemi come questo senza rinunciare al layout e scorrere tutto in una volta?

    Ho scoperto che non sono l'unico con questo problema. Per altri esempi, controllare quelle domande – senza soluzione di lavoro ancora:

    • WebView e GridView in ScrollView, Vista troppo grande per adattarsi alla cache di disegno
    • Android – Visualizza troppo grande per adattarsi alla cache di disegno

  • Sospendi CountDownTimer in Android quando l'attività non è di fronte
  • Fotocamera Android - Salva l'image in una nuova cartella in SD Card
  • Nascondere l'ActionBar su RecyclerView / ListView onScroll
  • È ansible call il codice quando l'applicazione Android viene disinstallata?
  • Come le applicazioni popolari autentano le richieste degli utenti dalla propria applicazione mobile al proprio server?
  • Programmaticamente in avanti bloccare un Android APK
  • 5 Solutions collect form web for “WebView in ScrollView: "Guarda troppo grande per adattarsi alla cache di disegno" – come rielaborare il layout?”

    Il problema sembra associato all'accelerazione hardware che viene abilitata per impostazione predefinita se il livello API è> = 14.

    Ho un'app con un ScrollView che contiene una serie di viste che voglio scorrere come una singola unità simile al poster originale – una di quelle visualizzazioni è una visualizzazione web che avvolge il suo contenuto. Se l'accelerazione hardware è triggers e il rendering WebView è complesso complesso (immagini, confini, ecc.), Il messaggio di errore della cache di disegno può essere visualizzato in LogCat. Alcune schermate con 12 elementi funzionavano mentre la schermata successiva con 13 elementi non funzionava. Non credo che sia il numero di elementi che fa la differenza, ma la complessità dello schermo finale reso.

    I sintomi sono tipicamente WebView bianco – le altre viste sono visivamente presenti e piene. Molto occasionalmente vedo l'integer schermo vuoto, ma è ansible che sia stato mentre mi sono imbattuto con vari suggerimenti trovati qui su SO.

    Il messaggio non è sempre visto. Ad esempio, vedo il problema su un Samsung Galaxy 4 Mini in esecuzione 4.2.2, mentre su altri dispositivi 4.x come il mio economico cinese Samsung S3 clone in esecuzione 4.1.2 tutto va bene. Non l'ho vista su alcun dispositivo 1.x o 2.x.

    Ho cercato di distriggersre in modo selettivo l'accelerazione hardware su varie visualizzazioni e layout nella gerarchia delle visualizzazioni, ma alla fine ho solo girato l'accelerazione hardware per l'intera applicazione nel file manifesto per frustrazione e vedere quante ore ho sprecato a seguire questo process.

    Dopo aver distriggersto l'accelerazione hardware tutti i problemi sono andati via. Non vedo alcuna differenza di performance evidente su nessuno dei miei dispositivi. Presumibilmente i dispositivi 1.x e 2.x non hanno mai usato l'accelerazione hardware in primo luogo e i miei dispositivi 4.x devono essere abbastanza veloci da far fronte al rendering del software. Non che le mie schermate siano così complicate.

    Aggiorna APRILE 2015

    Purtroppo il messaggio di avviso è tornato su Samsung Galaxy 4 Mini che ora esegue 4.4.2 anche con l'accelerazione hardware distriggersta. Ho un webview con un pannello JavaScript che apre / chiude l'animation. Tutto funziona bene, tranne che il layout iniziale (pannello aperto) solleva questi avvisi e each volta che chiudo o apro il pannello li ottengo anche. Questi avvertimenti sono ormai fastidiosi, l'applicazione funziona bene.

    Come le altre risposte indicate, il problema viene visualizzato quando l'accelerazione hardware è triggers. Ma spegnere l'accelerazione hardware per l'intera applicazione non era una soluzione per me.

    Ho pensato di poter risolvere il problema impostando android:layerType="software" per ScrollView , che distriggers solo l'accelerazione hardware per ScrollView e il suo contenuto.

     <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> 

    Si noti che questo può avere implicazioni negative in termini di performance, dal momento che il rendering nel software è di solito più lento.

    webView.setLayerType(WebView.LAYER_TYPE_NONE, null);

    ha lavorato per me. A seconda dell'hardware, non c'è memory per un ulteriore buffer di off-screen poiché WebView viene interamente presentato quando viene incorporato in un'altra visualizzazione di scorrimento.

    Lo considero un bug in Android che non è automaticamente rientrato a questa opzione (più lenta ma funzionante).

    Ho creato qualcosa di simile e tutto quello di cui avevo bisogno era aggiungere questo al mio WebView :

     android:layout_height="match_parent" 

    Questo funziona per me:

     <WebView android:id="@+id/wv" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="horizontal"/> 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.