66 votes

WebViewClient et WebChromeClient sont-ils mutuellement exclusifs ?

De ce grande explication sur les différences entre WebViewClient y WebChromeClient il semble que si vous utilisez l'un, vous ne devriez pas utiliser l'autre (pour le même objet WebView).

Ma compréhension est-elle correcte ?

Si non, quand utiliser les deux WebViewClient et WebChromeClient pour le même WebView objet ?

Existe-t-il un exemple d'une situation où l'on n'utilise que les deux WebViewClient et WebChromeClient pour le même WebView permettrait d'atteindre un certain objectif ?

86voto

NoBugs Points 2258

Vous pouvez certainement utiliser les deux, ils ont simplement des fonctions différentes. La définition de votre propre WebViewClient personnalisé vous permet de gérer onPageFinished, shouldOverrideUrlLoading, etc., tandis que le WebChromeClient vous permet de gérer alert() de Javascript et d'autres fonctions.

Il suffit de créer sa propre classe, par exemple :

public class MyWebChromeClient extends WebChromeClient {
    //Handle javascript alerts:
    @Override
public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result)  
{
  Log.d("alert", message);
  Toast.makeText(context, message, 3000).show();
  result.confirm();
  return true;
};
...

et / ou

public class MyWebViewClient extends WebViewClient {
@Override
    //Run script on every page, similar to Greasemonkey:
public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript:alert('hi')");
    }
...

Il suffit de remplacer les fonctions décrites dans la documentation, puis de définir votre client dans onCreate avec :

webview.setWebViewClient(new MyWebViewClient());
webview.setWebChromeClient(new MyWebChromeClient());

7voto

Tomasz Dzieniak Points 1702

Vous peut utiliser à la fois clients simultanément. C'est utile car les deux offrent des fonctionnalités différentes.

Par exemple, si vous souhaitez :

  • suivre les redirections dans la vue web plutôt que d'ouvrir le navigateur disponible

et

  • suivre la progression du chargement

qui sont impossibles avec un seul des clients vous pouvez faire ce qui suit :

WebView webView = (WebView) findViewById(R.id.web_view);
webView.setWebViewClient(new WebViewClient());
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);

        // Your custom code.
    }
});

Comme l'implémentation par défaut de shouldOverrideUrlLoading(WebView, String) peut être utilisée telle quelle pour le cas mentionné ci-dessus - il n'est pas nécessaire de la surcharger, sauf si vous souhaitez un autre comportement.

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