Ich habe eine WebView
, die eine Seite aus dem Internet lädt. Ich möchte ein anzeigen, ProgressBar
bis das Laden abgeschlossen ist.
Wie höre ich auf den Abschluss des Seitenladens von a WebView
?
android
android-webview
Janusz
quelle
quelle
Antworten:
Erweitern Sie WebViewClient und rufen Sie onPageFinished () wie folgt auf:
quelle
@ian das ist nicht 100% genau. Wenn Sie mehrere Iframes auf einer Seite haben, haben Sie mehrere onPageFinished (und onPageStarted). Und wenn Sie mehrere Weiterleitungen haben, kann dies ebenfalls fehlschlagen. Dieser Ansatz löst (fast) alle Probleme:
AKTUALISIEREN:
Gemäß der Dokumentation: onPageStarted wird NICHT aufgerufen, wenn sich der Inhalt eines eingebetteten Frames ändert, dh wenn Sie auf einen Link klicken, dessen Ziel ein Iframe ist.
Ich habe einen solchen speziellen Fall auf Twitter gefunden, in dem nur eine pageFinished aufgerufen wurde und die Logik ein wenig durcheinander gebracht hat. Um dies zu lösen, habe ich eine geplante Aufgabe hinzugefügt, um das Laden nach X Sekunden zu entfernen. Dies ist in allen anderen Fällen nicht erforderlich.
UPDATE 2 :
Jetzt mit der aktuellen Android WebView-Implementierung:
quelle
Ich bin ziemlich angetan von der Lösung @NeTeInStEiN (und @polen), hätte sie aber mit einem Zähler anstelle mehrerer Boolescher Werte oder Statusbeobachter implementiert (nur eine andere Variante, von der ich dachte, dass sie geteilt werden könnte). Es hat eine JS-Nuance, aber ich denke, die Logik ist etwas einfacher zu verstehen.
quelle
running = 1;
reinonPageStarted()
?Ich habe auch eine elegante Lösung gefunden, habe sie aber nicht rigoros getestet:
quelle
Ich habe den Code von NeTeInStEiN so vereinfacht :
Es ist leicht zu verstehen, OnPageFinished, wenn der vorherige Rückruf auf onPageStarted erfolgt, sodass die Seite vollständig geladen ist.
quelle
Wenn Sie einen Fortschrittsbalken anzeigen möchten, müssen Sie auf ein Fortschrittsänderungsereignis warten, nicht nur auf die Fertigstellung der Seite:
Übrigens, wenn Sie nur eine unbestimmte Fortschrittsanzeige anzeigen möchten, die die Methode onPageFinished überschreibt, ist dies ausreichend
quelle
Verwenden Sie setWebViewClient () und überschreiben Sie onPageFinished ()
quelle
Sie können den Progress Staus mithilfe der getProgress- Methode in der Webview- Klasse verfolgen .
Initialisieren Sie den Fortschrittsstatus
dann die AsyncTask zum Laden wie folgt:
quelle
Danke für die Antworten. Es hat mir geholfen, aber ich musste es ein bisschen für meine Bedürfnisse verbessern. Ich hatte mehrere Seitenstarts und Endungen, also habe ich einen Timer hinzugefügt, der prüft, ob nach dem Start der Seite ein neuer Seitenstart gestartet wird. Okay, schlechte Erklärung. Siehe den Code :)
quelle
Hier ist eine neuartige Methode zum Erkennen, wenn eine URL geladen wurde, indem die Android-Funktion für JavaScript-Hooks verwendet wird . Mit diesem Muster nutzen wir das Wissen von JavaScript über den Status des Dokuments, um einen nativen Methodenaufruf innerhalb der Android-Laufzeit zu generieren. Diese JavaScript-zugänglichen Aufrufe können mithilfe der
@JavaScriptInterface
Anmerkung erfolgen.Diese Implementierung erfordert, dass wir
setJavaScriptEnabled(true)
dieWebView
Einstellungen des Benutzers aufrufen , sodass sie abhängig von den Anforderungen Ihrer Anwendung, z. B. Sicherheitsbedenken , möglicherweise nicht geeignet ist .src / io / github / cawfree / webviewcallback / MainActivity.java (Jelly Bean, API Level 16)
res / layout / activity_main.xml
Im Wesentlichen fügen wir eine zusätzliche JavaScript-Funktion hinzu, mit der der Status des Dokuments getestet wird. Wenn es geladen ist, starten wir ein benutzerdefiniertes
onPageLoaded()
Ereignis in AndroidMainActivity
; Andernfalls registrieren wir einen Ereignis-Listener, der Android aktualisiert, sobald die Seite fertig istwindow.addEventListener('onload', ...);
.Da wir dieses Skript nach dem Aufruf sind Anfügen an
this.getWebView().loadURL("")
gemacht worden ist , ist es wahrscheinlich , dass wir nicht brauchen zu ‚hören‘ überhaupt für die Ereignisse, da wir nur eine Chance, den JavaScript - Haken anzuzuhängen , indem sie einen sukzessiven AufrufloadURL
, sobald die Seite bereits geladen wurde.quelle
Nur um den Fortschrittsbalken anzuzeigen, reichen die Methoden "onPageStarted" und "onPageFinished" aus. Wenn Sie jedoch ein "is_loading" -Flag (zusammen mit Seitenumleitungen, ...) haben möchten, werden diese Methoden möglicherweise ohne Sequenzierung ausgeführt, z. B. "onPageStarted> onPageStarted> onPageFinished> onPageFinished".
Bei meinem kurzen Test (testen Sie es selbst) lautet die Warteschlange für die Methodenwerte "onProgressChanged" "0-100> 0-100> 0-100> ...".
Setzen Sie
is_loading = false
beim Schließen der Aktivität auch " ", wenn es sich um eine statische Variable handelt, da die Aktivität vor dem Ende der Seite beendet werden kann.quelle
Laden URL mit
SwipeRefreshLayout
undProgressBar
:UrlPageActivity.java:
activity_url_page.xml:
quelle
Hier ist eine Methode, mit der Sie eine registrieren können
Runnable
, die ausgeführt werden soll, sobald eine bestimmte Webadresse vollständig geladen wurde. Wir verknüpfen jedeRunnable
mit einer entsprechenden URLString
in aMap
und verwenden die Methode vonWebView
'sgetOriginalUrl()
, um den entsprechenden Rückruf auszuwählen.quelle
Der Renderer beendet das Rendern nicht, wenn die OnPageFinshed-Methode aufgerufen wird oder der Fortschritt 100% erreicht, sodass beide Methoden nicht garantieren, dass die Ansicht vollständig gerendert wurde.
Mit der OnLoadResource-Methode können Sie jedoch herausfinden, was bereits gerendert wurde und was noch gerendert wird. Und diese Methode wird mehrmals aufgerufen.
quelle
Verwenden Sie dies, es sollte helfen.`var currentUrl = "google.com" var partOfUrl = currentUrl.substring (0, currentUrl.length-2)
webView.setWebViewClient (Objekt: WebViewClient () {
// Sie sollten auch andere Überschreibungsmethoden für Fehler wie onReceiveError überschreiben, um zu sehen, wie alle diese Methoden nacheinander aufgerufen werden und wie sie sich beim Debuggen mit Haltepunkt verhalten. } `
quelle
für Kotlin-Benutzer:
Es gibt jedoch viele Methoden, die Sie überschreiben können
quelle