El problema es el rendimiento después de la rotación. WebView tiene que volver a cargar la página, lo que puede ser un poco tedioso.
¿Cuál es la mejor manera de manejar un cambio de orientación sin volver a cargar la página desde el origen cada vez?
android
webview
orientation
glennanthonyb
fuente
fuente
Respuestas:
Si no desea que WebView se vuelva a cargar en los cambios de orientación, simplemente anule onConfigurationChanged en su clase de Actividad:
Y configure el atributo android: configChanges en el manifiesto:
Para obtener más información, consulte:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
fuente
configChanges
atributo se agrega a la subclase Actividad 2) Si su aplicación depende de múltiples proyectos, elconfigChanges
atributo se agrega al manifiesto del que está en el parte superior del árbol de dependencias (que puede no ser el proyecto que contiene la clase Actividad).onConfigurationChanged
anulación de método es inútil.Editar: este método ya no funciona como se indica en los documentos
Respuesta original:
Esto se puede manejar sobrescribiendo
onSaveInstanceState(Bundle outState)
su actividad y llamandosaveState
desde la vista web:Luego recupere esto en su onCreate después de que la vista web se haya vuelto a inflar, por supuesto:
fuente
La mejor respuesta a esto es seguir la documentación de Android que se encuentra aquí. Básicamente, esto evitará que Webview se vuelva a cargar:
Opcionalmente , puede corregir anomalías (si las hay) anulando
onConfigurationChanged
la actividad:fuente
Intenté usar onRetainNonConfigurationInstance (devolver el WebView ) y luego recuperarlo con getLastNonConfigurationInstance durante onCreate y reasignarlo.
Parece que aún no funciona. Sin embargo, no puedo evitar pensar que estoy muy cerca. Hasta ahora, acabo de obtener un WebView en blanco / fondo blanco en . Publicar aquí con la esperanza de que alguien pueda ayudar a superar esta meta.
Quizás no debería pasar el WebView . Quizás un objeto desde dentro de WebView ?
El otro método que probé, no es mi favorito, es configurar esto en la actividad:
... y luego no hago casi nada aquí:
ESO funciona, pero podría no considerarse una mejor práctica .
Mientras tanto, también tengo un único ImageView que quiero actualizar automáticamente según la rotación. Esto resulta ser muy fácil. Debajo de mi
res
carpeta, tengodrawable-land
y tengodrawable-port
variaciones de paisaje / retrato, luego las usoR.drawable.myimagename
para la fuente de ImageView y Android "hace lo correcto" - ¡sí!... excepto cuando observa cambios de configuración, entonces no lo hace. :(
Entonces estoy en desacuerdo. Use onRetainNonConfigurationInstance y la rotación ImageView funciona, pero la persistencia de WebView no ... o use onConfigurationChanged y WebView se mantiene estable, pero ImageView no se actualiza. ¿Qué hacer?
Una última nota: en mi caso, forzar la orientación no es un compromiso aceptable. Realmente queremos apoyar con gracia la rotación. ¡Un poco como lo hace la aplicación del navegador de Android! ;)
fuente
Un compromiso es evitar la rotación. Agregue esto para corregir la actividad solo para orientación vertical.
fuente
La mejor manera de manejar los cambios de orientación y evitar la recarga de WebView en Rotate.
Con eso en mente, para evitar que se llame a onCreate () cada vez que cambie de orientación, deberá agregar
android:configChanges="orientation|screenSize" to the AndroidManifest.
o solo ..
fuente
Simplemente escriba las siguientes líneas de código en su archivo de Manifiesto, nada más. Realmente funciona:
fuente
Aprecio que esto sea un poco tarde, sin embargo, esta es la respuesta que utilicé al desarrollar mi solución:
AndroidManifest.xml
WebClient.java
fuente
Puede intentar usar
onSaveInstanceState()
yonRestoreInstanceState()
en su Actividad para llamarsaveState(...)
yrestoreState(...)
en su instancia de WebView.fuente
Es 2015, y muchas personas están buscando una solución que todavía funcione en teléfonos Jellybean, KK y Lollipop. Después de mucho esfuerzo, encontré una manera de preservar la vista web intacta después de cambiar la orientación. Mi estrategia es básicamente almacenar la vista web en una variable estática separada en otra clase. Luego, si se produce rotación, desconecto la vista web de la actividad, espero a que termine la orientación y vuelvo a conectar la vista web a la actividad. Por ejemplo ... primero ponga esto en su MANIFEST (keyboardHidden y keyboard son opcionales):
En una CLASE DE APLICACIÓN SEPARADA, ponga:
En la ACTIVIDAD poner:
Finalmente, el XML simple:
Hay varias cosas que podrían mejorarse en mi solución, pero ya pasé mucho tiempo, por ejemplo: una forma más corta de validar si la Actividad se inició por primera vez en lugar de usar el almacenamiento de Preferencias Compartidas. Este enfoque conserva su vista web intacta (afaik), sus cuadros de texto, etiquetas, IU, variables de JavaScript y estados de navegación que no se reflejan en la URL.
fuente
Lo único que debe hacer es agregar este código a su archivo de manifiesto:
fuente
Actualización: la estrategia actual es mover la instancia de WebView a la clase Aplicación en lugar del fragmento retenido cuando se separa y volver a colocar en el currículum como lo hace Josh. Para evitar que la aplicación se cierre, debe usar el servicio en primer plano, si desea conservar el estado cuando el usuario cambia de una aplicación a otra.
Si está utilizando fragmentos, puede usar la instancia de retención de WebView. La vista web se conservará como miembro de instancia de la clase. Sin embargo, debe adjuntar la vista web en OnCreateView y desconectarla antes de OnDestroyView para evitar que se destruya con el contenedor principal.PD Créditos ir a kcoppock respuestaEn cuanto a 'SaveState ()' ya no funciona de acuerdo con la documentación oficial :
fuente
setRetainInstance
conserva el Fragmento, la vista (y, por lo tanto, la Vista web) aún se destruye.Estos métodos se pueden anular en cualquier actividad, básicamente solo le permite guardar y restaurar valores cada vez que se crea / destruye una actividad, cuando la orientación de la pantalla cambia, la actividad se destruye y se recrea en segundo plano, por lo que podría usar estos métodos almacenar temporalmente / restaurar estados durante el cambio.
Debe tener una mirada más profunda a los dos métodos siguientes y ver si se ajusta a su solución.
http://developer.android.com/reference/android/app/Activity.html
fuente
La mejor solución que he encontrado para hacer esto sin filtrar la
Activity
referencia anterior y sin configurar elconfigChanges
... es usar un MutableContextWrapper .He implementado esto aquí: https://github.com/slightfoot/android-web-wrapper/blob/48cb3c48c457d889fc16b4e3eba1c9e925f42cfb/WebWrapper/src/com/example/webwrapper/BrowserActivity.java
fuente
Esto es lo único que funcionó para mí (incluso utilicé el estado de guardar instancia
onCreateView
pero no fue tan confiable).Hice un titular Singleton para el estado de WebView. El estado se conserva mientras exista el proceso de la aplicación.
EDITAR: No
loadDataWithBaseURL
fue necesario, funcionó tan bien con soloAunque leí esto, no necesariamente funciona bien con las cookies.
fuente
prueba esto
fuente
Esta página resuelve mi problema, pero tengo que hacer un ligero cambio en la inicial:
Esta porción tiene un pequeño problema para mí esto. En la segunda orientación, cambie la aplicación terminada con un puntero nulo
usando esto funcionó para mí:
fuente
Deberías probar esto:
onServiceConnected
método, obtenga el WebView y llame alsetContentView
método para representar su WebView.Lo probé y funciona, pero no con otros WebViews como XWalkView o GeckoView.
fuente
fuente
Me gusta esta solucion http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/
Según esto, reutilizamos la misma instancia de WebView. Permite guardar el historial de navegación y la posición de desplazamiento en el cambio de configuración.
fuente