Problemem jest wydajność po rotacji. WebView musi ponownie załadować stronę, co może być trochę uciążliwe.
Jaki jest najlepszy sposób obsługi zmiany orientacji bez ponownego ładowania strony ze źródła za każdym razem?
android
webview
orientation
glennanthonyb
źródło
źródło
Odpowiedzi:
Jeśli nie chcesz, aby WebView ponownie ładował się po zmianach orientacji, po prostu zastąp onConfigurationChanged w swojej klasie Activity:
I ustaw atrybut android: configChanges w manifeście:
aby uzyskać więcej informacji, zobacz:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
źródło
configChanges
atrybut zostanie dodany do podklasy Działanie 2) Jeśli twoja aplikacja zależy od wielu projektów,configChanges
atrybut zostanie dodany do manifestu tego w wierzchołek drzewa zależności (który może nie być projektem zawierającym klasę Activity).onConfigurationChanged
nadpisanie metody jest bezużyteczne.Edycja: ta metoda nie działa już zgodnie z opisem w dokumentacji
Oryginalna odpowiedź:
Można to zrobić, nadpisując
onSaveInstanceState(Bundle outState)
swoją aktywność i dzwoniącsaveState
z widoku internetowego:Następnie odzyskaj to w swoim onCreate po ponownym zawyżeniu widoku internetowego:
źródło
Najlepszą odpowiedzią na to jest poniższa dokumentacja Androida, którą znajdziesz tutaj. Zasadniczo zapobiegnie to ponownemu załadowaniu Webview:
Opcjonalnie możesz naprawić anomalie (jeśli występują), nadpisując
onConfigurationChanged
działanie:źródło
Próbowałem użyć onRetainNonConfigurationInstance (zwracając WebView ), a następnie odzyskać go za pomocą getLastNonConfigurationInstance podczas onCreate i ponownie przypisać.
Wydaje się, że jeszcze nie działa. Nie mogę pomóc, ale myślę, że jestem naprawdę blisko! Jak dotąd, po prostu otrzymuję WebView z pustym / białym tłem zamiast tego . Publikowanie tutaj w nadziei, że ktoś może pomóc przepchnąć to poza linię mety.
Może nie powinienem przekazywać WebView . Być może obiekt z WebView ?
Inną metodą, którą wypróbowałem - nie moją ulubioną - jest ustawienie tego w ćwiczeniu:
... a potem prawie nic tutaj nie rób:
TO działa, ale może nie być uważane za najlepszą praktykę .
W międzyczasie mam też pojedynczy ImageView, który chcę automagicznie aktualizować w zależności od rotacji. Okazuje się, że jest to bardzo łatwe. W moim
res
folderze mamdrawable-land
idrawable-port
przechowuję odmiany w poziomie / pionie, a następnie używamR.drawable.myimagename
do ImageView źródła , a Android „robi to, co należy” - yay!... z wyjątkiem sytuacji, gdy obserwujesz zmiany konfiguracji, wtedy tak się nie dzieje. :(
Więc jestem w sprzeczności. Użyj onRetainNonConfigurationInstance i rotacji ImageView działa, ale trwałość WebView nie ... lub użyj onConfigurationChanged, a WebView pozostaje stabilny, ale ImageView nie jest aktualizowany. Co robić?
Ostatnia uwaga: w moim przypadku wymuszanie orientacji nie jest akceptowalnym kompromisem. Naprawdę chcemy z wdziękiem wspierać rotację. Trochę jak aplikacja Android Browser! ;)
źródło
Jednym z kompromisów jest unikanie rotacji. Dodaj to, aby naprawić działanie tylko dla orientacji pionowej.
źródło
Najlepszy sposób na obsługę zmian orientacji i zapobieganie ponownemu ładowaniu WebView podczas obracania.
Mając to na uwadze, aby zapobiec wywoływaniu onCreate () za każdym razem, gdy zmieniasz orientację, musisz dodać
android:configChanges="orientation|screenSize" to the AndroidManifest.
Lub tylko ..
źródło
Po prostu napisz następujące linie kodu w swoim pliku manifestu - nic więcej. To naprawdę działa:
źródło
Doceniam, że jest trochę za późno, ale tak brzmi odpowiedź, której użyłem przy tworzeniu mojego rozwiązania:
AndroidManifest.xml
WebClient.java
źródło
Możesz spróbować użyć
onSaveInstanceState()
ionRestoreInstanceState()
na swojej Aktywności, aby zadzwonićsaveState(...)
irestoreState(...)
na swojej instancji WebView.źródło
Jest rok 2015 i wiele osób szuka rozwiązania, które nadal działa na telefonach Jellybean, KK i Lollipop. Po wielu zmaganiach znalazłem sposób na zachowanie widoku internetowego w nienaruszonym stanie po zmianie orientacji. Moja strategia polega w zasadzie na przechowywaniu widoku internetowego w oddzielnej zmiennej statycznej w innej klasie. Następnie, jeśli nastąpi obrót, odłączam widok internetowy od działania, czekam na zakończenie orientacji i ponownie przyłączam widok internetowy do działania. Na przykład ... najpierw umieść to w swoim MANIFESTIE (klawiaturaHidden i klawiatura są opcjonalne):
W ODDZIELNEJ KLASIE ZASTOSOWAŃ umieść:
W ACTIVITY wpisz:
Wreszcie prosty XML:
Jest kilka rzeczy, które można by ulepszyć w moim rozwiązaniu, ale spędziłem już za dużo czasu, na przykład: krótszy sposób sprawdzenia, czy działanie zostało uruchomione po raz pierwszy, zamiast korzystania z magazynu SharedPreferences. Takie podejście zachowuje widok sieci Web w stanie nienaruszonym (afaik), jego pola tekstowe, etykiety, interfejs użytkownika, zmienne javascript i stany nawigacji, które nie są odzwierciedlane w adresie URL.
źródło
Jedyne, co powinieneś zrobić, to dodać ten kod do pliku manifestu:
źródło
Aktualizacja: obecna strategia polega na przeniesieniu instancji WebView do klasy Application zamiast zachowywanego fragmentu po odłączeniu i ponownym dołączeniu przy wznowieniu, tak jak robi to Josh. Aby zapobiec zamykaniu aplikacji, należy używać usługi pierwszego planu, jeśli chcesz zachować stan, gdy użytkownik przełącza się między aplikacjami.
Jeśli używasz fragmentów, możesz użyć zachowywania wystąpienia WebView. Widok sieciowy zostanie zachowany jako element członkowski instancji klasy. Należy jednak dołączyć widok sieci Web w OnCreateView i odłączyć przed OnDestroyView, aby zapobiec jego zniszczeniu za pomocą kontenera nadrzędnego.Kredyty PS przejdź do odpowiedzi kcoppockJeśli chodzi o 'SaveState ()', nie działa już zgodnie z oficjalną dokumentacją :
źródło
setRetainInstance
zachowuje fragment, widok (a tym samym WebView) nadal jest niszczony.Metody te można nadpisać w dowolnym działaniu, w zasadzie pozwala to na zapisywanie i przywracanie wartości za każdym razem, gdy działanie jest tworzone / niszczone, gdy zmienia się orientacja ekranu, działanie zostaje zniszczone i odtworzone w tle, więc możesz użyć tych metod do tymczasowego przechowywania / przywracania stanów podczas zmiany.
Powinieneś dokładniej przyjrzeć się dwóm następującym metodom i sprawdzić, czy pasuje do Twojego rozwiązania.
http://developer.android.com/reference/android/app/Activity.html
źródło
Najlepszym rozwiązaniem, jakie znalazłem, aby to zrobić bez wycieku poprzedniego
Activity
odniesienia i bez ustawianiaconfigChanges
.., jest użycie MutableContextWrapper .Zaimplementowałem to tutaj: https://github.com/slightfoot/android-web-wrapper/blob/48cb3c48c457d889fc16b4e3eba1c9e925f42cfb/WebWrapper/src/com/example/webwrapper/BrowserActivity.java
źródło
To jedyna rzecz, która działała dla mnie (użyłem nawet stanu zapisywania instancji w,
onCreateView
ale nie był on tak niezawodny).Zrobiłem uchwyt Singleton dla stanu WebView. Stan jest zachowywany tak długo, jak trwa proces aplikacji.
EDYCJA: Nie
loadDataWithBaseURL
było to konieczne, działało równie dobrze z justChociaż czytałem, to niekoniecznie działa dobrze z plikami cookie.
źródło
Spróbuj tego
źródło
Ta strona rozwiązuje mój problem, ale muszę wprowadzić niewielką zmianę w pierwszej:
Ta porcja ma dla mnie mały problem z tym. W drugiej orientacji zmień aplikację zakończoną wskaźnikiem zerowym
używając tego, zadziałało dla mnie:
źródło
Powinieneś spróbować tego:
onServiceConnected
metodzie pobierz WebView i wywołajsetContentView
metodę, aby renderować swój WebView.Przetestowałem to i działa, ale nie z innymi WebView, takimi jak XWalkView czy GeckoView.
źródło
źródło
Podoba mi się to rozwiązanie http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/
Zgodnie z nią ponownie używamy tej samej instancji WebView. Pozwala na zapisanie historii nawigacji i przewijanie pozycji przy zmianie konfiguracji.
źródło