Ich habe eine App, die ein WebView in großem Umfang nutzt. Wenn der Benutzer dieser App keine Internetverbindung hat, wird eine Seite mit der Aufschrift "Webseite nicht verfügbar" und verschiedenen anderen Texten angezeigt. Gibt es eine Möglichkeit, diesen generischen Text in meinem WebView nicht anzuzeigen? Ich möchte meine eigene Fehlerbehandlung bereitstellen.
private final Activity activity = this;
private class MyWebViewClient extends WebViewClient
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
// I need to do something like this:
activity.webView.wipeOutThePage();
activity.myCustomErrorHandling();
Toast.makeText(activity, description, Toast.LENGTH_LONG).show();
}
}
Ich habe herausgefunden, dass WebView-> clearView die Ansicht nicht wirklich löscht .
Antworten:
Erstellen Sie zuerst Ihre eigene Fehlerseite in HTML und legen Sie sie in Ihrem Assets-Ordner ab. Nennen wir sie myerrorpage.html. Dann mit onReceivedError:
quelle
view.loadUrl("about:blank");
Fügen Sie vor loadUrl hinzu, um zu verhindern, dass die Fehlerseite für den Bruchteil einer Sekunde angezeigt wird.Die beste Lösung, die ich gefunden habe, besteht darin, eine leere Seite in das OnReceivedError-Ereignis wie folgt zu laden:
quelle
view.loadUrl(noConnectionUrl);
zweimal hinzugefügt (wobei noConnectionUrl eine lokale Datei mit Fehlermeldung ist). Dies half auch, die eingebaute Fehlerseite für den Bruchteil einer Sekunde nicht zu "sehen".webView.goBack()
bei der Bearbeitung die Bedingungen für diese leere Seite berücksichtigen müssen. Andernfalls wird Ihre vorherige Seite geladen. Wenn dies erneut fehlschlägt, wird diese leere Seite erneut angezeigt.Schließlich habe ich das gelöst. (Es funktioniert bis jetzt ..)
Meine Lösung ist wie folgt ...
Bereiten Sie das Layout so vor, dass angezeigt wird, wann ein Fehler anstelle der Webseite aufgetreten ist (eine schmutzige Meldung "Seite nicht gefunden"). Das Layout verfügt über eine Schaltfläche "RELOAD" mit einigen Leitmeldungen.
Wenn ein Fehler aufgetreten ist, denken Sie daran, Boolesche Werte zu verwenden, und zeigen Sie das von uns vorbereitete Layout an.
Hier ist meine vollständige Quelle. Überprüfen Sie dies heraus.
Ergänzung: Hier ist Layout ....
quelle
Wenn die Webansicht in eine benutzerdefinierte Ansicht eingebettet ist, sodass der Benutzer fast glaubt, eine native Ansicht und keine Webansicht zu sehen, ist es in einem solchen Szenario absurd, den Fehler "Seite konnte nicht geladen werden" anzuzeigen. Was ich normalerweise in einer solchen Situation mache, ist, dass ich eine leere Seite lade und eine Toastnachricht wie unten zeige
quelle
Schauen Sie sich die Diskussion bei Android WebView onReceivedError () an . Es ist ziemlich lang, aber der Konsens scheint zu sein, dass a) Sie das Erscheinen der Seite "Webseite nicht verfügbar" nicht stoppen können, aber b) Sie immer eine leere Seite laden können, nachdem Sie einen onReceivedError erhalten haben
quelle
onReceivedError
nicht auszulösen. Es wird in meinem Code korrekt ausgelöst, wenn keine Internetverbindung besteht.Sie können eine
GET
Anforderung verwenden, um den Seiteninhalt abzurufen und diese Daten dann mithilfe von anzuzeigen. AufWebview
diese Weise verwenden Sie nicht mehrere Serveraufrufe. Alternativ können SieJavascript
dasDOM
Objekt auf Gültigkeit prüfen .quelle
Vielleicht verstehe ich die Frage falsch, aber es hört sich so an, als würden Sie sagen, dass Sie den Fehler erhalten haben, und Sie fragen sich nur, wie Sie den Fehler am besten nicht anzeigen können. Warum entfernen Sie nicht einfach die Webansicht vom Bildschirm und / oder zeigen eine andere Ansicht darüber an?
quelle
Hier habe ich die einfachste Lösung gefunden. Schau dir das an..
Und hier ist die Methode isInterentConnection () ...
quelle
Ich nehme an, wenn Sie darauf bestehen, können Sie einfach überprüfen, ob die Ressource vorhanden ist, bevor Sie die Funktion loadURL aufrufen. Überschreiben Sie einfach die Funktionen und führen Sie die Überprüfung durch, bevor Sie super () aufrufen.
BEMERKUNG (möglicherweise nicht zum Thema gehörend): In http gibt es eine Methode namens HEAD, die wie folgt beschrieben wird:
Diese Methode könnte nützlich sein. Wie auch immer Sie es implementieren ... überprüfen Sie diesen Code:
Sie können diese Prüfung mit versuchen
quelle
Ich würde einfach die Webseite auf das ändern, was Sie zur Fehlerbehandlung verwenden:
Dies alles finden Sie unter http://developer.android.com/reference/android/webkit/WebView.html
quelle
Ich habe heute an diesem Problem gearbeitet, diese gereizten Google-Fehlerseiten loszuwerden. Es ist mit dem oben gezeigten Android-Beispielcode und in vielen anderen Foren möglich (fragen Sie, woher ich das weiß):
WENN Sie es in shouldOverrideUrlLoading () als einen weiteren Webclient einfügen. Zumindest funktioniert dies für mich auf meinem 2.3.6-Gerät. Wir werden später sehen, wo es sonst noch funktioniert. Das würde mich jetzt nur deprimieren, da bin ich mir sicher. Das goBack-Bit gehört mir. Sie können es nicht wollen.
quelle
Versuche dies
quelle
Wir können die Sichtbarkeit von webView auf 0 (view.INVISIBLE) setzen und eine Meldung anzeigen. Dieser Code funktioniert für meine App, die auf Lolipop ausgeführt wird.
quelle
Ich musste mich diesem Problem stellen und habe auch versucht, es aus verschiedenen Perspektiven zu lösen. Schließlich fand ich eine Lösung, indem ich mit einem einzigen Flag überprüfte, ob ein Fehler aufgetreten war.
Auf diese Weise verstecke ich die Seite jedes Mal, wenn ein Fehler auftritt, und zeige sie an, wenn die Seite erneut ordnungsgemäß geladen wurde.
Auch eine kleine Verzögerung für den Fall hinzugefügt.
Ich habe die Lösung des Ladens einer leeren Seite vermieden, da Sie später nicht webview.reload () ausführen können, da diese neue Seite im Navigationsverlauf hinzugefügt wird.
quelle
Versuchen Sie dies, sollteOverrideUrlLoading , bevor Sie zu einer anderen URL weiterleiten , um zu überprüfen, ob die Internetverbindung basierend auf dieser Seite geladen ist oder nicht.
quelle
Überschreiben Sie Ihre WebViewClient-Methode
view.loadUrl('about:blank')
hat Nebenwirkungen, da das Laden der ursprünglichen URL abgebrochen wird.quelle