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?
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());
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:
et
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.