Mam WebView
stronę ładującą stronę z Internetu. Chcę pokazywać, ProgressBar
aż ładowanie się zakończy.
Jak słuchać zakończenia ładowania strony WebView
?
android
android-webview
Janusz
źródło
źródło
Odpowiedzi:
Rozszerz WebViewClient i wywołaj onPageFinished () w następujący sposób:
źródło
@ian nie jest to w 100% dokładne. Jeśli masz kilka ramek iframe na stronie, będziesz mieć wiele onPageFinished (i onPageStarted). A jeśli masz kilka przekierowań, może również nie powieść się. To podejście rozwiązuje (prawie) wszystkie problemy:
AKTUALIZACJA:
Zgodnie z dokumentacją: onPageStarted NIE zostanie wywołany, gdy zmieni się zawartość osadzonej ramki, tj. Kliknięcie łącza, którego celem jest element iframe.
Znalazłem taki konkretny przypadek na Twitterze, gdzie wywołano tylko stronęFinished i trochę popsułem logikę. Aby rozwiązać ten problem, dodałem zaplanowane zadanie usuwania ładowania po X sekundach. Nie jest to konieczne we wszystkich innych przypadkach.
AKTUALIZACJA 2 :
Teraz z aktualną implementacją Android WebView:
źródło
Jestem dość stronniczy w stosunku do rozwiązania @NeTeInStEiN (i @polen), ale zaimplementowałbym go z licznikiem zamiast wielu boolanów lub obserwatorów stanu (tylko inny smak, ale myślałem, że mogę się nim podzielić). Ma w sobie niuans JS, ale myślę, że logika jest nieco łatwiejsza do zrozumienia.
źródło
running = 1;
wonPageStarted()
?Znalazłem też jedno eleganckie rozwiązanie, ale nie przetestowałem go rygorystycznie:
źródło
Upraszczam kod NeTeInStEiN , aby był taki:
Łatwo to zrozumieć, OnPageFinished, jeśli poprzednie wywołanie zwrotne jest włączone naPageStarted, więc strona jest całkowicie załadowana.
źródło
Jeśli chcesz pokazać pasek postępu, musisz nasłuchiwać zdarzenia zmiany postępu, a nie tylko ukończenia strony:
BTW, jeśli chcesz wyświetlić tylko nieokreślony pasek postępu przesłaniający metodę onPageFinished, wystarczy
źródło
Użyj setWebViewClient () i przesłoń onPageFinished ()
źródło
Możesz śledzić postępów Staus przez getProgress metody w Webview klasie.
Zainicjuj status postępu
następnie AsyncTask do ładowania w ten sposób:
źródło
dzięki za odpowiedzi. Pomogło mi to, ale musiałem to trochę poprawić dla moich potrzeb. Miałem kilka stron próbnych i zakończeń, więc dodałem licznik czasu, który sprawdza, czy po ukończeniu strony rozpoczyna się nowa strona próbna. Okej, złe wyjaśnienie. Zobacz kod :)
źródło
Oto nowatorska metoda wykrywania po załadowaniu adresu URL przy użyciu funkcji Androida do przechwytywania skryptów JavaScript . Korzystając z tego wzorca, wykorzystujemy wiedzę JavaScript o stanie dokumentu do generowania natywnego wywołania metody w środowisku wykonawczym Androida. Te wywołania dostępne w JavaScript można wykonywać za pomocą
@JavaScriptInterface
adnotacji.Ta implementacja wymaga, którą nazywamy
setJavaScriptEnabled(true)
wWebView
ustawieniach „s, więc to nie może być odpowiednie w zależności od wymagań Twojej aplikacji, np względów bezpieczeństwa.src / io / github / cawfree / webviewcallback / MainActivity.java (Jelly Bean, API Level 16)
res / layout / activity_main.xml
Zasadniczo dodajemy dodatkową funkcję JavaScript, która służy do testowania stanu dokumentu. Jeśli jest załadowany, uruchamiamy niestandardowy
onPageLoaded()
wydarzenie w systemie AndroidMainActivity
; w przeciwnym razie rejestrujemy detektor zdarzeń, który aktualizuje system Android, gdy strona jest gotowa, używającwindow.addEventListener('onload', ...);
.Ponieważ dołączamy ten skrypt po nawiązaniu połączenia
this.getWebView().loadURL("")
, jest prawdopodobne, że wcale nie musimy „nasłuchiwać” wydarzeń, ponieważ mamy szansę dołączyć haczyk JavaScript, wykonując kolejne wywołanieloadURL
, po załadowaniu strony.źródło
Aby wyświetlić pasek postępu, wystarczą metody „onPageStarted” i „onPageFinished”; ale jeśli chcesz mieć flagę „is_loading” (wraz z przekierowaniami strony, ...), metody te mogą być wykonywane bez sekwencjonowania, takie jak kolejka „onPageStarted> onPageStarted> onPageFinished> onPageFinished”.
Ale w moim krótkim teście (przetestuj sam.) Kolejka wartości metod „onProgressChanged” to „0-100> 0-100> 0-100> ...”
Ustaw także „
is_loading = false
” przy zamknięciu działania, jeśli jest to zmienna statyczna, ponieważ działanie można zakończyć przed zakończeniem strony.źródło
Ładowanie
SwipeRefreshLayout
ProgressBar
adresu URL za pomocą i :UrlPageActivity.java:
activity_url_page.xml:
źródło
Oto metoda, która umożliwia zarejestrowanie
Runnable
do wykonania po zakończeniu ładowania określonego adresu internetowego. Kojarzy nam się każdyRunnable
z odpowiednim adresem URLString
w miłymMap
i używamyWebView
„sgetOriginalUrl()
metody, aby wybrać odpowiedni zwrotnego.źródło
Mechanizm renderujący nie zakończy renderowania, gdy zostanie wywołana metoda OnPageFinshed lub postęp osiągnie 100%, więc obie metody nie gwarantują całkowitego renderowania widoku.
Ale z metody OnLoadResource można dowiedzieć się, co zostało już wyrenderowane, a co nadal renderowane. I ta metoda jest wywoływana kilka razy.
źródło
Użyj tego, co powinno pomóc .var currentUrl = "google.com" var partOfUrl = currentUrl.substring (0, currentUrl.length-2)
webView.setWebViewClient (obiekt: WebViewClient () {
// Powinieneś również przesłonić inną metodę zastępowania błędów, taką jak onReceiveError, aby zobaczyć, jak wszystkie te metody są wywoływane jedna po drugiej i jak zachowują się podczas debugowania z punktem przerwania. } `
źródło
dla użytkowników Kotlin:
istnieje jednak wiele metod, które można zastąpić
źródło