web-dev-qa-db-fra.com

Quelle est la différence entre setWebViewClient et setWebChromeClient?

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

214
Pentium10

À partir 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 dialogues Javascript, les favicons, les titres et la progression. Jetez un coup d'oeil à cet exemple: Ajout du support alert () à une WebView

À première vue, il y a trop de différences WebViewClient & WebChromeClient . Mais, fondamentalement, si vous développez une WebView qui ne nécessite pas trop de fonctionnalités mais qui rend le rendu HTML, vous pouvez simplement utiliser un WebViewClient. D'autre part, si vous voulez (par exemple) charger le favicon de la page que vous êtes en train de rendre, utilisez un objet WebChromeClient et remplacez la onReceivedIcon(WebView view, Bitmap icon).

La plupart du temps, si vous ne voulez pas vous soucier de ces choses-là, 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.).

137
Cristian

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

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

Le chargement de l'URL doit être effectué après la configuration de WebView. Vous devez donc effectuer cette opération 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 diverses propriétés que vous pouvez définir, telles que la chaîne de l'agent utilisateur et la taille du texte.

Ensuite, 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. Vous pouvez par exemple 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 dispose 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 lors du chargement d'une nouvelle URL dans WebView, par exemple en appuyant sur un lien. Si vous renvoyez true, vous dites "Ne gérez pas cette URL, je le gère moi-même". Si vous renvoyez false, vous indiquez "Allez-y, chargez cette URL, WebView, je ne fais rien avec elle. . "

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 font certaines applications Web est de vous rediriger vers la version mobile du site Web. Avec WebViewClient par défaut, cela signifie que vous êtes immédiatement envoyé au navigateur Web par défaut de l'utilisateur. C'est ce que vous essayez d'éviter. Le correctif est simple: il suffit de remplacer l'implémentation par défaut et de renvoyer false.

tilisez WebChromeClient pour améliorer 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 connecter la barre de progression, vous utiliserez le deuxième rappel sur WebView: WebChromeClient.

WebViewClient est une interface permettant de répondre aux événements de rendu. WebChromeClient est une interface d'événement permettant de réagir aux événements devant modifier les éléments de chrome autour du navigateur. Cela inclut les alertes JavaScript, les favicons et, bien sûr, les mises à jour relatives à la progression du chargement et au titre de la page actuelle.

Branchez-le dans onCreateView(…). Utilisation de WebChromeClient pour améliorer les choses Les mises à jour de Progress et de titres ont chacune leur propre méthode de rappel, onProgressChanged(WebView, int) et onReceivedTitle(WebView, String). La progression que vous recevez de onProgressChanged(WebView, int) est un entier compris entre 0 et 100. S'il est égal à 100, vous savez que le chargement de la page est terminé. Vous devez donc masquer la barre de progression en définissant sa visibilité sur View.GONE.

Avertissement: Cette information a été extraite de Android Programmation: The Big Nerd Ranch Guide avec l’autorisation des auteurs. Pour plus d'informations sur ce livre ou pour en acheter un exemplaire, visitez le site bignerdranch.com.

63