WebViewClient和WebChromeClient是互斥的吗?

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

我的理解是正确的吗?

如果不是,那么在什么时候将WebViewClient WebChromeClient用于同一个WebView对象?

有没有一个情况的例子,只有同一个WebView对象使用WebViewClient WebChromeClient才能完成特定的目标?

你当然可以同时使用,他们只是有不同的function。 设置你自己定制的WebViewClient可以让你处理onPageFinished,shouldOverrideUrlLoading等,WebChromeClient让你处理Javascript的alert()和其他function。

只要自己创build一个类,例如:

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

只需覆盖文档中描述的function,然后在onCreate中设置您的客户端:

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

可以同时使用两个客户端。 这是有用的,因为它们都提供不同的function。

例如,如果您想要:

  • 按照Web视图中的redirect,而不是打开可用的浏览器

  • 跟踪加载进度

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

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

由于shouldOverrideUrlLoading(WebView,String)方法的默认实现可以用于上述情况,因此除非您想要其他行为,否则无需重写它。