272 votes

Quelle est la différence entre setWebViewClient et setWebChromeClient ?

Quelle est la différence entre setWebViewClient vs. setWebChromeClient dans Android ?

0 votes

J'ai ajouté plus d'informations

162voto

Cristian Points 92147

De la code source :

// 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;
}

L'utilisation de WebChromeClient vous permet de gérer les boîtes de dialogue Javascript, les favicons, les titres et la progression. Jetez un coup d'œil à cet exemple : Ajout de la fonction alert() à un WebView

A première vue, il y a trop de différences WebViewClient & WebChromeClient . Mais, en gros : si vous développez un WebView qui ne nécessitera pas trop de fonctionnalités mais qui rendra du HTML, vous pouvez simplement utiliser un WebViewClient . En revanche, si vous souhaitez (par exemple) charger la favicon de la page que vous êtes en train de rendre, vous devez utiliser une balise WebChromeClient et remplacer l'objet onReceivedIcon(WebView view, Bitmap icon) .

La plupart du temps, si tu ne veux pas t'inquiéter de ces choses... tu peux juste faire ça :

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

Et votre WebView aura (en théorie) toutes les fonctionnalités implémentées (comme le navigateur natif d'Android).

27 votes

Sous cette forme, la réponse n'est pas complète. ChromeClient permet de gérer les choses énumérées mais qu'est-ce que ViewClient et quelles sont les similitudes et les différences ?

3 votes

Cette méthode permettra-t-elle d'améliorer certaines fonctionnalités médiocres du webview par défaut, notamment pour les animations et transitions css3 ?

1 votes

Puis-je utiliser les deux à la fois ?

134voto

Je pense que cette question nécessite un peu plus de détails. Ma réponse est inspirée du livre Android Programming, The Big Nerd Ranch Guide (2e édition).

Par défaut JavaScript est désactivé dans WebView. Il n'est pas toujours nécessaire de l'activer, mais certaines applications peuvent en avoir besoin.

Le chargement de l'URL doit être effectué après la configuration du WebView, c'est pourquoi vous le faites en dernier. Avant cela, vous activez JavaScript en appelant getSettings() pour obtenir une instance de WebSettings et appeler WebSettings.setJavaScriptEnabled(true) . WebSettings est la première des trois façons dont vous pouvez modifier votre WebView. Elle possède diverses propriétés que vous pouvez définir, comme la chaîne de l'agent utilisateur et la taille du texte.

Après cela, vous configurez votre WebViewClient. WebViewClient est une interface d'événement. En fournissant votre propre implémentation de WebViewClient, vous pouvez répondre aux événements de rendu. Par exemple, vous pouvez détecter quand le moteur de rendu commence à charger une image à partir d'une URL particulière ou décider de soumettre à nouveau une requête POST au serveur.

WebViewClient possède de nombreuses méthodes que vous pouvez surcharger, dont la plupart ne vous concernent pas. Cependant, vous devez remplacer l'implémentation par défaut de WebViewClient de la méthode shouldOverrideUrlLoading(WebView, String) . Cette méthode détermine ce qui se passe lorsqu'une nouvelle URL est chargée dans le WebView, par exemple en appuyant sur un lien. Si vous renvoyez true (vrai), vous dites : "Ne vous occupez pas de cette URL, je m'en occupe moi-même". Si vous renvoyez false, vous dites : "Allez-y et chargez cette URL, WebView, je n'en ferai rien".

L'implémentation par défaut déclenche une intention implicite avec l'URL, comme vous l'avez fait précédemment. Maintenant, cependant, ce serait un grave problème. La première chose que font certaines applications Web est de vous rediriger vers la version mobile du site. Avec le WebViewClient par défaut, cela signifie que vous êtes immédiatement envoyé vers le navigateur Web par défaut de l'utilisateur. C'est justement ce que vous essayez d'éviter. La solution est simple : il suffit de remplacer l'implémentation par défaut et de renvoyer false.

Utiliser WebChromeClient pour améliorer les choses Puisque vous prenez le temps de créer votre propre WebView, améliorons-la un peu en ajoutant une barre de progression et en mettant à jour le sous-titre de la barre d'outils avec le titre de la page chargée.

Pour connecter la barre de progression, vous utiliserez le deuxième rappel sur WebView : WebChromeClient .

WebViewClient est une interface permettant de réagir aux événements de rendu ; WebChromeClient est une interface permettant de réagir aux événements qui doivent modifier les éléments de chrome dans le navigateur. Cela inclut les alertes JavaScript, les favicons, et bien sûr les mises à jour de la progression du chargement et du titre de la page actuelle.

Accrochez-le dans onCreateView(…) . Utiliser WebChromeClient pour améliorer les choses Les mises à jour de la progression et du titre ont chacune leur propre méthode de rappel, onProgressChanged(WebView, int) y onReceivedTitle(WebView, String) . Les progrès que vous recevez de onProgressChanged(WebView, int) est un nombre entier de 0 à 100. S'il est égal à 100, vous savez que le chargement de la page est terminé, et vous masquez la barre de progression en définissant sa visibilité sur View.GONE .

Avis de non-responsabilité : Ces informations ont été tirées de Android Programming : The Big Nerd Ranch Guide avec l'autorisation des auteurs. Pour en savoir plus informations sur ce livre ou pour en acheter un exemplaire, rendez-vous sur le site bignerdranch.com.

5voto

CoolMind Points 11

Si vous voulez enregistrer les erreurs à partir d'une page web, vous devez utiliser WebChromeClient et remplacer son onConsoleMessage :

webView.settings.apply {
    javaScriptEnabled = true
    javaScriptCanOpenWindowsAutomatically = true
    domStorageEnabled = true
}
webView.webViewClient = WebViewClient()
webView.webChromeClient = MyWebChromeClient()

private class MyWebChromeClient : WebChromeClient() {
    override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
        Timber.d("${consoleMessage.message()}")
        Timber.d("${consoleMessage.lineNumber()} ${consoleMessage.sourceId()}")
        return super.onConsoleMessage(consoleMessage)
    }
}

3voto

qtmfld Points 1263

WebViewClient fournit les méthodes de rappel suivantes, avec lesquelles vous pouvez interférer dans la manière dont les WebView fait une transition vers le prochain contenu .

void doUpdateVisitedHistory (WebView view, String url, boolean isReload)
void onFormResubmission (WebView view, Message dontResend, Message resend)
void onLoadResource (WebView view, String url)
void onPageCommitVisible (WebView view, String url)
void onPageFinished (WebView view, String url)
void onPageStarted (WebView view, String url, Bitmap favicon)
void onReceivedClientCertRequest (WebView view, ClientCertRequest request)
void onReceivedError (WebView view, int errorCode, String description, String failingUrl)
void onReceivedError (WebView view, WebResourceRequest request, WebResourceError error)
void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm)
void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse)
void onReceivedLoginRequest (WebView view, String realm, String account, String args)
void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)
boolean onRenderProcessGone (WebView view, RenderProcessGoneDetail detail)
void onSafeBrowsingHit (WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback)
void onScaleChanged (WebView view, float oldScale, float newScale)
void onTooManyRedirects (WebView view, Message cancelMsg, Message continueMsg)
void onUnhandledKeyEvent (WebView view, KeyEvent event)
WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
WebResourceResponse shouldInterceptRequest (WebView view, String url)
boolean shouldOverrideKeyEvent (WebView view, KeyEvent event)
boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request)
boolean shouldOverrideUrlLoading (WebView view, String url)

WebChromeClient fournit les méthodes de rappel suivantes, avec lesquelles votre Activity o Fragment peut mettre à jour le environnement de WebView .

Bitmap getDefaultVideoPoster ()
View getVideoLoadingProgressView ()
void getVisitedHistory (ValueCallback<String[]> callback)
void onCloseWindow (WebView window)
boolean onConsoleMessage (ConsoleMessage consoleMessage)
void onConsoleMessage (String message, int lineNumber, String sourceID)
boolean onCreateWindow (WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)
void onExceededDatabaseQuota (String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, WebStorage.QuotaUpdater quotaUpdater)
void onGeolocationPermissionsHidePrompt ()
void onGeolocationPermissionsShowPrompt (String origin, GeolocationPermissions.Callback callback)
void onHideCustomView ()
boolean onJsAlert (WebView view, String url, String message, JsResult result)
boolean onJsBeforeUnload (WebView view, String url, String message, JsResult result)
boolean onJsConfirm (WebView view, String url, String message, JsResult result)
boolean onJsPrompt (WebView view, String url, String message, String defaultValue, JsPromptResult result)
boolean onJsTimeout ()
void onPermissionRequest (PermissionRequest request)
void onPermissionRequestCanceled (PermissionRequest request)
void onProgressChanged (WebView view, int newProgress)
void onReachedMaxAppCacheSize (long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater)
void onReceivedIcon (WebView view, Bitmap icon)
void onReceivedTitle (WebView view, String title)
void onReceivedTouchIconUrl (WebView view, String url, boolean precomposed)
void onRequestFocus (WebView view)
void onShowCustomView (View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback)
void onShowCustomView (View view, WebChromeClient.CustomViewCallback callback)
boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X