Quelle est la différence entre setWebViewClient et setWebChromeClient?


Réponses:


148

Du 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 œil à cet exemple: Ajout de la prise en charge alert () à une WebView

À première vue, il existe trop de différences WebViewClient & WebChromeClient . Mais, fondamentalement: si vous développez une WebView qui ne nécessitera pas trop de fonctionnalités mais un rendu HTML, vous pouvez simplement utiliser a WebViewClient. D'un autre côté, si vous voulez (par exemple) charger le favicon de la page que vous rendez, vous devez utiliser un WebChromeClientobjet et remplacer le onReceivedIcon(WebView view, Bitmap icon).

La plupart du temps, si vous ne voulez pas vous inquiéter de ces choses ... vous pouvez simplement faire ceci:

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 Android).


26
Dans ce formulaire, 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?
Pentium10

3
Cette méthode aidera-t-elle à améliorer certaines fonctionnalités médiocres de la vue Web par défaut? surtout pour les animations et transitions css3?
Ata Iravani

1
Puis-je utiliser les deux à la fois?
Sergey Dirin

1
@SergeyDirin: stackoverflow.com/a/6475858 . Référez-vous à cette réponse, vous pouvez utiliser les deux à la fois.
hoangtu23

Comment gérer les autorisations pour la caméra dans webviewclient si vous n'avez pas de chrome?
j2emanue

100

Je pense que cette question a besoin d'un peu plus de détails. Ma réponse est inspirée de la programmation Android, The Nerd Ranch Guide (2nd edition).

Par défaut , JavaScript est désactivé dans WebView. Vous n'avez pas toujours besoin de l'avoir, mais pour certaines applications, cela peut être nécessaire.

Le chargement de l'URL doit être effectué après la configuration de WebView, vous devez donc le faire en dernier. Avant cela, vous activez JavaScript en appelant getSettings()pour obtenir une instance de WebSettings et en appelant WebSettings.setJavaScriptEnabled(true). WebSettings est la première des trois façons dont vous pouvez modifier votre WebView. Il a différentes 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 le moment où le moteur de rendu commence à charger une image à partir d'une URL particulière ou décider de soumettre à nouveau une demande POST au serveur.

WebViewClient propose de nombreuses méthodes que vous pouvez remplacer, dont la plupart ne seront pas traitées. Cependant, vous devez remplacer l'implémentation par défaut de WebViewClient de shouldOverrideUrlLoading(WebView, String). Cette méthode détermine ce qui se passera lorsqu'une nouvelle URL est chargée dans la WebView, comme en appuyant sur un lien. Si vous retournez vrai, vous dites: «Ne gérez pas cette URL, je la gère moi-même.» Si vous retournez false, vous dites: "Allez-y et chargez cette URL, WebView, je ne fais rien avec."

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 problème grave. La première chose que certaines applications Web font est de vous rediriger vers la version mobile du site Web. 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 exactement ce que vous essayez d'éviter. Le correctif est simple - remplacez simplement l'implémentation par défaut et retournez false.

Utilisez WebChromeClient pour embellir les choses Puisque vous prenez le temps de créer votre propre WebView, améliorons-le 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 brancher la barre de progression, vous utiliserez la deuxième rappel sur WebView: WebChromeClient.

WebViewClient est une interface pour répondre aux événements de rendu; WebChromeClient est une interface d'événement pour réagir aux événements qui devraient changer des éléments de chrome autour du navigateur. Cela inclut des alertes JavaScript, des favicons et bien sûr des mises à jour pour la progression du chargement et le titre de la page actuelle.

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

Avertissement: Ces informations proviennent de la programmation Android: The Big Nerd Ranch Guide avec la permission des auteurs. Pour plus d'informations sur ce livre ou pour en acheter un exemplaire, veuillez visiter bignerdranch.com.


11
Je pense que c'est une meilleure réponse que celle acceptée.
redbeam_
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.