web-dev-qa-db-fra.com

WebViewClient et WebChromeClient s'excluent-ils mutuellement?

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

Ma compréhension est-elle correcte?

Sinon, quand utiliserait-on à la fois WebViewClient et WebChromeClient pour le même objet WebView?

Existe-t-il un exemple de situation où n'utilisez que WebViewClient et WebChromeClient pour le même WebView l'objet atteindrait-il un certain objectif?

65
ef2011

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

Créez votre 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')");
    }
...

Remplacez simplement les fonctions décrites dans la documentation, puis définissez votre client dans onCreate avec:

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

Vous pouvez utiliser simultanément les deux clients. Il est utile car les deux offrent des fonctionnalités différentes.

Par exemple, si vous souhaitez:

  • suivez 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 la méthode shouldOverrideUrlLoading (WebView, String) peut être utilisée telle quelle dans le cas mentionné ci-dessus - il n'est pas nécessaire de la remplacer sauf si vous souhaitez un autre comportement.

6
Tomasz Dzieniak