Das Problem ist die Leistung nach der Rotation. Das WebView muss die Seite neu laden, was etwas mühsam sein kann.
Was ist der beste Weg, um eine Orientierungsänderung zu handhaben, ohne die Seite jedes Mal von der Quelle neu zu laden?
android
webview
orientation
Glennanthonyb
quelle
quelle
Antworten:
Wenn Sie nicht möchten, dass WebView bei Änderungen der Ausrichtung neu geladen wird, überschreiben Sie einfach onConfigurationChanged in Ihrer Aktivitätsklasse:
Und setzen Sie das Attribut android: configChanges im Manifest:
Weitere Informationen finden Sie unter:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
quelle
configChanges
Attribut der Unterklasse hinzugefügt. Aktivität 2) Wenn Ihre App von mehreren Projekten abhängt, wird dasconfigChanges
Attribut dem Manifest des Projekts am hinzugefügt oben im Abhängigkeitsbaum (möglicherweise nicht das Projekt, das die Aktivitätsklasse enthält).onConfigurationChanged
Methodenüberschreibung ist nutzlos.Bearbeiten: Diese Methode funktioniert nicht mehr wie in den Dokumenten angegeben
Ursprüngliche Antwort:
Dies kann durch Überschreiben
onSaveInstanceState(Bundle outState)
Ihrer Aktivität und AufrufensaveState
aus der Webansicht erfolgen:Stellen Sie dies dann in Ihrem onCreate wieder her, nachdem die Webansicht natürlich wieder aufgeblasen wurde:
quelle
Die beste Antwort darauf ist die folgende Android-Dokumentation, die hier zu finden ist. Grundsätzlich verhindert dies, dass Webview neu geladen wird:
Optional können Sie Anomalien (falls vorhanden) beheben, indem Sie
onConfigurationChanged
die Aktivität überschreiben :quelle
Ich habe versucht, onRetainNonConfigurationInstance zu verwenden (das WebView zurückzugeben ), es dann mit getLastNonConfigurationInstance während onCreate zurückzugewinnen und neu zuzuweisen .
Scheint noch nicht zu funktionieren. Ich kann nicht anders als zu denken, dass ich wirklich nah dran bin! Bisher bekomme ich stattdessen nur ein WebView mit leerem / weißem Hintergrund . Poste hier in der Hoffnung, dass jemand helfen kann, diesen über die Ziellinie zu schieben.
Vielleicht sollte ich das WebView nicht weitergeben . Möglicherweise ein Objekt aus dem WebView ?
Die andere Methode, die ich ausprobiert habe - nicht meine Lieblingsmethode - besteht darin, dies in der Aktivität festzulegen:
... und dann so ziemlich nichts hier machen:
DAS funktioniert, aber es kann nicht als Best Practice angesehen werden .
Mittlerweile habe ich auch eine einzelne ImageView , die ich je nach Rotation automatisch aktualisieren möchte. Dies stellt sich als sehr einfach heraus. Unter meinem
res
Ordner habedrawable-land
unddrawable-port
halte ich Quer- / Hochformatvarianten, die ich dannR.drawable.myimagename
für die ImageView verwende -Quelle und Android "macht das Richtige" - yay!... außer wenn Sie auf Konfigurationsänderungen achten, dann nicht. :((
Also bin ich uneins. Verwenden Sie onRetainNonConfigurationInstance und die ImageView- Rotation funktioniert, aber die WebView- Persistenz funktioniert nicht ... oder verwenden Sie onConfigurationChanged und die WebView bleibt stabil, aber die ImageView wird nicht aktualisiert. Was ist zu tun?
Ein letzter Hinweis: In meinem Fall ist das Erzwingen der Orientierung kein akzeptabler Kompromiss. Wir möchten die Rotation wirklich elegant unterstützen. Ein bisschen wie die Android Browser App! ;)
quelle
Ein Kompromiss besteht darin, eine Rotation zu vermeiden. Fügen Sie dies hinzu, um die Aktivität nur für die Porträtausrichtung zu korrigieren.
quelle
Der beste Weg, um Orientierungsänderungen zu handhaben und das erneute Laden von WebView beim Drehen zu verhindern.
Um zu verhindern, dass onCreate () jedes Mal aufgerufen wird, wenn Sie die Ausrichtung ändern, müssen Sie hinzufügen
android:configChanges="orientation|screenSize" to the AndroidManifest.
oder nur ..
quelle
Schreiben Sie einfach die folgenden Codezeilen in Ihre Manifest-Datei - sonst nichts. Es funktioniert wirklich:
quelle
Ich schätze, dass dies etwas spät ist, aber dies ist die Antwort, die ich bei der Entwicklung meiner Lösung verwendet habe:
AndroidManifest.xml
WebClient.java
quelle
Sie können mit Hilfe versuchen
onSaveInstanceState()
undonRestoreInstanceState()
auf Ihrer Aktivität zu nennensaveState(...)
undrestoreState(...)
auf Ihrer WebView - Instanz.quelle
Es ist 2015 und viele Menschen suchen nach einer Lösung, die immer noch auf Jellybean-, KK- und Lollipop-Telefonen funktioniert. Nach vielem kämpfen , fand ich einen Weg , um die Webansicht intakt zu erhalten , nachdem Sie Orientierung ändern. Meine Strategie besteht im Wesentlichen darin, die Webansicht in einer separaten statischen Variablen in einer anderen Klasse zu speichern. Wenn dann eine Drehung auftritt, entferne ich die Webansicht von der Aktivität, warte, bis die Ausrichtung abgeschlossen ist, und füge die Webansicht wieder der Aktivität hinzu. Zum Beispiel ... setzen Sie dies zuerst auf Ihr MANIFEST (KeyboardHidden und Keyboard sind optional):
Geben Sie in einer SEPARATEN ANWENDUNGSKLASSE Folgendes ein:
In die AKTIVITÄT setzen:
Zum Schluss das einfache XML:
Es gibt einige Dinge, die in meiner Lösung verbessert werden könnten, aber ich habe bereits zu viel Zeit aufgewendet, zum Beispiel: eine kürzere Methode, um zu überprüfen, ob die Aktivität zum ersten Mal gestartet wurde, anstatt den SharedPreferences-Speicher zu verwenden. Bei diesem Ansatz bleiben die Webansicht (afaik), ihre Textfelder, Beschriftungen, Benutzeroberflächen, Javascript-Variablen und Navigationszustände erhalten, die nicht in der URL wiedergegeben werden.
quelle
Das einzige, was Sie tun sollten, ist diesen Code zu Ihrer Manifestdatei hinzuzufügen:
quelle
Update: Die aktuelle Strategie besteht darin, die WebView-Instanz in die Anwendungsklasse zu verschieben, anstatt das Fragment beizubehalten, wenn es getrennt wird, und beim Fortsetzen erneut anzuhängen, wie es Josh tut. Um zu verhindern, dass die Anwendung geschlossen wird, sollten Sie den Vordergrunddienst verwenden, wenn Sie den Status beibehalten möchten, wenn der Benutzer zwischen Anwendungen wechselt.
Wenn Sie Fragmente verwenden, können Sie die Instanz von WebView beibehalten verwenden. Die Webansicht bleibt als Instanzmitglied der Klasse erhalten. Sie sollten jedoch die Webansicht in OnCreateView anhängen und vor OnDestroyView trennen, um zu verhindern, dass sie mit dem übergeordneten Container zerstört wird.PS Credits gehen an kcoppock Antwort'SaveState ()' funktioniert laut offizieller Dokumentation nicht mehr :
quelle
setRetainInstance
die Ansicht (und damit die WebView) weiterhin zerstört wird , während das Fragment beibehalten wird.Diese Methoden können für jede Aktivität überschrieben werden. Sie können lediglich Werte speichern und wiederherstellen, wenn eine Aktivität erstellt / zerstört wird. Wenn sich die Bildschirmausrichtung ändert, wird die Aktivität zerstört und im Hintergrund neu erstellt. Daher können Sie diese Methoden verwenden während der Änderung Zustände vorübergehend speichern / wiederherstellen.
Sie sollten sich die beiden folgenden Methoden genauer ansehen und prüfen, ob sie zu Ihrer Lösung passen.
http://developer.android.com/reference/android/app/Activity.html
quelle
Die beste Lösung, die ich gefunden habe, um dies zu tun, ohne die vorherige
Activity
ReferenzconfigChanges
zu verlieren und ohne das .. zu setzen, ist die Verwendung eines MutableContextWrapper .Ich habe dies hier implementiert: https://github.com/slightfoot/android-web-wrapper/blob/48cb3c48c457d889fc16b4e3eba1c9e925f42cfb/WebWrapper/src/com/example/webwrapper/BrowserActivity.java
quelle
Dies ist das einzige, was für mich funktioniert hat (ich habe sogar den Status "Instanz speichern" verwendet,
onCreateView
aber er war nicht so zuverlässig).Ich habe einen Singleton-Halter für den Status von WebView erstellt. Der Status bleibt erhalten, solange der Prozess der Anwendung vorhanden ist.
EDIT: Das
loadDataWithBaseURL
war nicht nötig, es hat genauso gut mit just funktioniertObwohl ich gelesen habe, funktioniert dies nicht unbedingt gut mit Cookies.
quelle
Versuche dies
quelle
Diese Seite löst mein Problem, aber ich muss die erste geringfügig ändern:
Dieser Teil hat für mich ein kleines Problem. Bei der zweiten Ausrichtung wird die Anwendung mit dem Nullzeiger beendet
Damit hat es bei mir funktioniert:
quelle
Sie sollten dies versuchen:
onServiceConnected
Verfahren, das WebView zu erhalten und die ruftsetContentView
Methode , um Ihre WebView zu machen.Ich habe es getestet und es funktioniert, aber nicht mit anderen WebViews wie XWalkView oder GeckoView.
quelle
quelle
Ich mag diese Lösung http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/
Demnach verwenden wir dieselbe Instanz von WebView wieder. Es ermöglicht das Speichern des Navigationsverlaufs und des Bildlaufs bei Konfigurationsänderungen.
quelle