Le problème est la performance après la rotation. Le WebView doit recharger la page, ce qui peut être un peu fastidieux.
Quelle est la meilleure façon de gérer un changement d'orientation sans recharger la page à partir de la source à chaque fois?
android
webview
orientation
glennanthonyb
la source
la source
Réponses:
Si vous ne souhaitez pas que WebView se recharge lors des changements d'orientation, remplacez simplement onConfigurationChanged dans votre classe Activity:
Et définissez l'attribut android: configChanges dans le manifeste:
pour plus d'informations, voir:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
la source
configChanges
attribut est ajouté à la sous-classe Activité 2) Si votre application dépend de plusieurs projets, l'configChanges
attribut est ajouté au manifeste de celui au en haut de l'arborescence des dépendances (qui peut ne pas être le projet contenant la classe Activity).onConfigurationChanged
remplacement de méthode est inutile.Edit: cette méthode ne fonctionne plus comme indiqué dans la documentation
Réponse originale:
Cela peut être géré en écrasant
onSaveInstanceState(Bundle outState)
votre activité et en appelant àsaveState
partir de la vue Web:Ensuite, récupérez-le dans votre onCreate après que la vue Web ait été regonflée bien sûr:
la source
La meilleure réponse à cela est de suivre la documentation Android trouvée ici Fondamentalement, cela empêchera Webview de se recharger:
Vous pouvez éventuellement corriger les anomalies (le cas échéant) en remplaçant
onConfigurationChanged
dans l'activité:la source
J'ai essayé d'utiliser onRetainNonConfigurationInstance (retournant le WebView ), puis de le récupérer avec getLastNonConfigurationInstance pendant onCreate et de le réattribuer.
Cela ne semble pas encore fonctionner. Je ne peux pas m'empêcher de penser que je suis vraiment proche! Jusqu'à présent, j'obtiens juste une WebView vierge / fond blanc à la place. Publier ici dans l'espoir que quelqu'un puisse aider à pousser celui-ci au-delà de la ligne d'arrivée.
Peut-être que je ne devrais pas passer le WebView . Peut-être un objet de la WebView ?
L'autre méthode que j'ai essayée - pas ma préférée - est de définir ceci dans l'activité:
... et puis ne faites pratiquement rien ici:
CELA fonctionne, mais cela pourrait ne pas être considéré comme une meilleure pratique .
En attendant, j'ai également un seul ImageView que je souhaite mettre à jour automatiquement en fonction de la rotation. Cela s'avère très facile. Dans mon
res
dossier, j'aidrawable-land
et je doisdrawable-port
contenir des variations paysage / portrait, puis j'utiliseR.drawable.myimagename
pour la source ImageView et Android "fait ce qu'il faut" - yay!... sauf quand vous regardez les changements de configuration, alors ce n'est pas le cas. :(
Donc je suis en désaccord. Utilisez onRetainNonConfigurationInstance et les ImageView travaux de rotation, mais WebView persistance ne pas ... ou l' utilisation onConfigurationChanged et WebView reste stable, mais le ImageView ne met pas à jour. Que faire?
Une dernière remarque: dans mon cas, forcer l'orientation n'est pas un compromis acceptable. Nous voulons vraiment soutenir gracieusement la rotation. Un peu comme le fait l'application Navigateur Android! ;)
la source
Un compromis est d'éviter la rotation. Ajoutez ceci pour corriger l'activité pour l'orientation Portrait uniquement.
la source
Meilleur moyen de gérer les changements d'orientation et d'empêcher le rechargement de WebView lors de la rotation.
Dans cet esprit, pour éviter que onCreate () ne soit appelé à chaque fois que vous changez d'orientation, vous devrez ajouter
android:configChanges="orientation|screenSize" to the AndroidManifest.
ou juste ..
la source
Écrivez simplement les lignes de code suivantes dans votre fichier Manifest - rien d'autre. Ça marche vraiment:
la source
J'apprécie que ce soit un peu tard, mais c'est la réponse que j'ai utilisée lors du développement de ma solution:
AndroidManifest.xml
WebClient.java
la source
Vous pouvez essayer d'utiliser
onSaveInstanceState()
etonRestoreInstanceState()
sur votre activité pour appelersaveState(...)
etrestoreState(...)
sur votre instance WebView.la source
Nous sommes en 2015 et de nombreuses personnes recherchent une solution qui fonctionne toujours sur les téléphones Jellybean, KK et Lollipop. Après beaucoup de difficultés, j'ai trouvé un moyen de préserver la vue Web intacte après avoir changé d'orientation. Ma stratégie consiste essentiellement à stocker la vue Web dans une variable statique distincte dans une autre classe. Ensuite, si une rotation se produit, je détache la vue Web de l'activité, attend la fin de l'orientation et rattache la vue Web à l'activité. Par exemple ... mettez d'abord ceci sur votre MANIFEST (keyboardHidden et keyboard sont facultatifs):
Dans une CLASSE D'APPLICATION SÉPARÉE, mettez:
Dans l'activité mettez:
Enfin, le simple XML:
Il y a plusieurs choses qui pourraient être améliorées dans ma solution, mais j'ai déjà passé beaucoup de temps, par exemple: un moyen plus court de valider si l'activité a été lancée pour la toute première fois au lieu d'utiliser le stockage SharedPreferences. Cette approche préserve votre vue Web intacte (afaik), ses zones de texte, ses étiquettes, son interface utilisateur, ses variables javascript et ses états de navigation qui ne sont pas reflétés par l'URL.
la source
La seule chose que vous devriez faire est d'ajouter ce code à votre fichier manifeste:
la source
Mise à jour: la stratégie actuelle consiste à déplacer l'instance WebView vers la classe Application au lieu du fragment conservé lorsqu'elle est détachée et de la rattacher au redémarrage comme le fait Josh. Pour empêcher l'application de se fermer, vous devez utiliser le service de premier plan si vous souhaitez conserver l'état lorsque l'utilisateur bascule entre les applications.
Si vous utilisez des fragments, vous pouvez utiliser une instance de conservation de WebView. La vue Web sera conservée comme membre d'instance de la classe. Vous devez cependant attacher la vue Web dans OnCreateView et la détacher avant OnDestroyView pour l'empêcher de se détruire avec le conteneur parent.Les crédits PS vont à la réponse de kcoppockQuant à 'SaveState ()', il ne fonctionne plus selon la documentation officielle :
la source
setRetainInstance
le fragment conserve le fragment, la vue (et donc la WebView) est toujours détruite.Ces méthodes peuvent être remplacées sur n'importe quelle activité, cela vous permet simplement d'enregistrer et de restaurer des valeurs chaque fois qu'une activité est créée / détruite, lorsque l'orientation de l'écran change, l'activité est détruite et recréée en arrière-plan, vous pouvez donc utiliser ces méthodes aux états de stockage / restauration temporaires pendant la modification.
Vous devriez examiner plus en détail les deux méthodes suivantes et voir si cela correspond à votre solution.
http://developer.android.com/reference/android/app/Activity.html
la source
La meilleure solution que j'ai trouvée pour faire cela sans divulguer la
Activity
référence précédente et sans définir leconfigChanges
.. est d'utiliser un MutableContextWrapper .J'ai implémenté ceci ici: https://github.com/slightfoot/android-web-wrapper/blob/48cb3c48c457d889fc16b4e3eba1c9e925f42cfb/WebWrapper/src/com/example/webwrapper/BrowserActivity.java
la source
C'est la seule chose qui a fonctionné pour moi (j'ai même utilisé l'état de sauvegarde de l'instance
onCreateView
mais ce n'était pas aussi fiable).J'ai fait un support Singleton pour l'état de la WebView. L'état est conservé tant que le processus de l'application existe.
EDIT: Ce
loadDataWithBaseURL
n'était pas nécessaire, cela fonctionnait aussi bien avec justeBien que j'aie lu, cela ne fonctionne pas nécessairement bien avec les cookies.
la source
essaye ça
la source
Cette page résout mon problème mais je dois faire un léger changement dans la première:
Cette partie a un léger problème pour moi cela. Lors du deuxième changement d'orientation, l'application s'est terminée avec un pointeur nul
en utilisant cela, cela a fonctionné pour moi:
la source
Vous devriez essayer ceci:
onServiceConnected
méthode, récupérez WebView et appelez lasetContentView
méthode pour rendre votre WebView.Je l'ai testé et cela fonctionne mais pas avec d'autres WebViews comme XWalkView ou GeckoView.
la source
la source
J'aime cette solution http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/
Selon lui, nous réutilisons la même instance de WebView. Il permet de sauvegarder l'historique de navigation et de faire défiler la position lors du changement de configuration.
la source