WebViewClient 和 WebChromeClient 是相互排斥的吗?

从这个 很好的解释关于 WebViewClientWebChromeClient之间的差异看来,如果你使用一个,你就不应该使用另一个(对于同一个 WebView 对象)。

我的理解正确吗?

如果没有,那么什么时候对同一个 WebView对象同时使用 WebViewClient 还有 WebChromeClient

是否有这样一种情况,即对同一个 WebView对象只使用同一个 WebViewClient 还有 WebChromeClient就可以达到某个目的?

80177 次浏览

你当然可以同时使用它们,只是它们有不同的功能。设置自己的定制 WebViewClient 允许您处理 onPageFinish、 should dOverrideUrlLoading 等,WebChromeClient 允许您处理 Javascript 的 alert ()和其他函数。

例如,你可以自己创建一个类:

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;
};
...

及/或

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')");
}
...

只需覆盖文档中描述的函数,然后将您的客户机设置为 onCreate:

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

您可以同时使用 都可以用客户端。这很有用,因为它们提供不同的功能。

例如,如果你想:

  • 在 web 视图中跟随重定向,而不是打开可用的浏览器

  • 追踪装货进度

这是不可能的只有一个客户端 你可以做到以下几点:

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.
}
});

由于对于上述情况,Should dOverrideUrlLoding (WebView,String)方法的默认实现可以按原样使用,因此没有必要重写它,除非您想要其他行为。