Was ist der Unterschied zwischen setWebViewClient und setWebChromeClient?


Antworten:


148

Aus dem Quellcode :

// Instance of WebViewClient that is the client callback.
private volatile WebViewClient mWebViewClient;
// Instance of WebChromeClient for handling all chrome functions.
private volatile WebChromeClient mWebChromeClient;

// SOME OTHER SUTFFF.......

/**
 * Set the WebViewClient.
 * @param client An implementation of WebViewClient.
 */
public void setWebViewClient(WebViewClient client) {
    mWebViewClient = client;
}

/**
 * Set the WebChromeClient.
 * @param client An implementation of WebChromeClient.
 */
public void setWebChromeClient(WebChromeClient client) {
    mWebChromeClient = client;
}

Mit WebChromeClient können Sie Javascript-Dialoge, Favoriten, Titel und den Fortschritt verarbeiten. Schauen Sie sich dieses Beispiel an: Hinzufügen der Unterstützung von alert () zu einer WebView

Auf den ersten Blick gibt es zu viele Unterschiede zwischen WebViewClient und WebChromeClient . Aber im Grunde genommen: Wenn Sie eine WebView entwickeln, die nicht zu viele Funktionen erfordert, sondern HTML rendert, können Sie einfach a verwenden WebViewClient. Wenn Sie jedoch (zum Beispiel) das Favicon der Seite laden möchten, die Sie rendern, sollten Sie ein WebChromeClientObjekt verwenden und das überschreiben onReceivedIcon(WebView view, Bitmap icon).

Wenn Sie sich über diese Dinge keine Sorgen machen möchten, können Sie dies meistens einfach tun:

webView= (WebView) findViewById(R.id.webview); 
webView.setWebChromeClient(new WebChromeClient()); 
webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(url); 

Und in Ihrem WebView werden (theoretisch) alle Funktionen implementiert (als nativer Android-Browser).


26
In diesem Formular ist die Antwort nicht vollständig. ChromeClient ermöglicht die Handhabung der aufgezählten Dinge, aber was ist ViewClient und was sind die Ähnlichkeiten und Unterschiede?
Pentium10

3
Wird diese Methode dazu beitragen, einige schlechte Funktionen der Standard-Webansicht zu verbessern? speziell für css3 animationen und übergänge?
Ata Iravani

1
Kann ich beide gleichzeitig verwenden?
Sergey Dirin

1
@SergeyDirin: stackoverflow.com/a/6475858 . Beziehen Sie sich auf diese Antwort, Sie können beide gleichzeitig verwenden.
Hoangtu23

Wie gehe ich mit der Berechtigung für die Kamera im Webviewclient um, wenn ich kein Chrom habe?
j2emanue

99

Ich denke, diese Frage braucht ein bisschen mehr Details. Meine Antwort ist inspiriert von der Android-Programmierung, The Nerd Ranch Guide (2. Ausgabe).

Standardmäßig ist JavaScript in WebView deaktiviert. Sie müssen es nicht immer aktiviert haben, aber für einige Apps ist es möglicherweise erforderlich.

Das Laden der URL muss nach der Konfiguration von WebView erfolgen, damit Sie dies zuletzt tun können. Zuvor getSettings()aktivieren Sie JavaScript, indem Sie aufrufen , um eine Instanz von WebSettings abzurufen, und aufrufen WebSettings.setJavaScriptEnabled(true). WebSettings ist die erste der drei Möglichkeiten, wie Sie Ihre WebView ändern können. Es verfügt über verschiedene Eigenschaften, die Sie festlegen können, z. B. die Zeichenfolge des Benutzeragenten und die Textgröße.

Danach konfigurieren Sie Ihren WebViewClient. WebViewClient ist eine Ereignisschnittstelle. Indem Sie Ihre eigene Implementierung von WebViewClient bereitstellen, können Sie auf Rendering-Ereignisse reagieren. Sie können beispielsweise erkennen, wann der Renderer ein Bild von einer bestimmten URL lädt, oder entscheiden, ob eine POST-Anforderung erneut an den Server gesendet werden soll.

WebViewClient verfügt über viele Methoden, die Sie überschreiben können. Die meisten davon werden Sie nicht behandeln. Sie müssen jedoch die Standardimplementierung von WebViewClient ersetzen shouldOverrideUrlLoading(WebView, String). Diese Methode bestimmt, was passiert, wenn eine neue URL in die WebView geladen wird, beispielsweise durch Drücken eines Links. Wenn Sie true zurückgeben, sagen Sie: "Behandeln Sie diese URL nicht, ich verarbeite sie selbst." Wenn Sie false zurückgeben, sagen Sie: "Laden Sie diese URL, WebView, ich mache nichts damit."

Die Standardimplementierung löst wie zuvor eine implizite Absicht mit der URL aus. Dies wäre jedoch ein ernstes Problem. Einige Webanwendungen leiten Sie zunächst zur mobilen Version der Website weiter. Mit dem Standard-WebViewClient bedeutet dies, dass Sie sofort an den Standard-Webbrowser des Benutzers gesendet werden. Dies ist genau das, was Sie vermeiden wollen. Das Update ist einfach: Überschreiben Sie einfach die Standardimplementierung und geben Sie false zurück.

Verwenden Sie WebChromeClient, um die Dinge aufzufrischen. Da Sie sich die Zeit nehmen, Ihre eigene WebView zu erstellen, können Sie sie ein wenig aufpeppen, indem Sie einen Fortschrittsbalken hinzufügen und den Untertitel der Symbolleiste mit dem Titel der geladenen Seite aktualisieren.

Um die ProgressBar anzuschließen, verwenden Sie den zweiten Rückruf in WebView : WebChromeClient.

WebViewClient ist eine Schnittstelle zum Reagieren auf Rendering-Ereignisse. WebChromeClient ist eine Ereignisschnittstelle zum Reagieren auf Ereignisse, die Chrome-Elemente im Browser ändern sollen. Dies umfasst JavaScript-Warnungen, Favoriten und natürlich Aktualisierungen zum Laden des Fortschritts und den Titel der aktuellen Seite.

Schließen Sie es an onCreateView(…). Mit WebChromeClient zu Fichte Dinge Fortschritt Updates und Titel aktualisiert jeweils ihre eigene Callback - Methode hat, onProgressChanged(WebView, int)und onReceivedTitle(WebView, String). Der Fortschritt, von dem Sie erhalten, onProgressChanged(WebView, int)ist eine Ganzzahl von 0 bis 100. Wenn es 100 ist, wissen Sie, dass das Laden der Seite abgeschlossen ist. Sie verbergen die ProgressBar, indem Sie ihre Sichtbarkeit auf einstellen View.GONE.

Haftungsausschluss: Diese Informationen stammen aus der Android-Programmierung: The Big Nerd Ranch Guide mit Genehmigung der Autoren. Für weitere Informationen zu diesem Buch oder um eine Kopie zu erwerben, besuchen Sie bitte bignerdranch.com.


11
Ich denke, das ist eine bessere Antwort als die akzeptierte.
redbeam_
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.