WebViewClient和WebChromeClient是互斥的吗?

时间:2011-06-24 23:36:03

标签: android webview webviewclient webchromeclient

关于WebViewClientWebChromeClient之间的差异great explanation,似乎如果使用其中一个,则不应使用另一个(对于同一个WebView对象)。< / p>

我的理解是否正确?

如果没有,何时会同时使用WebViewClient WebChromeClient作为同一WebView个对象?

是否有一个例子表明同一个WebViewClient对象只使用WebChromeClient WebView才能达到某个目标?

2 个答案:

答案 0 :(得分:84)

你当然可以同时使用它们,它们只是具有不同的功能。设置您自己的自定义WebViewClient可以处理onPageFinished,shouldOverrideUrlLoading等,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());

答案 1 :(得分:6)

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

例如,如果您想:

  • 在网络视图中关注重定向,而不是打开可用的浏览器

  • 跟踪加载进度

只有一个客户是不可能的,您可以执行以下操作:

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)方法的默认实现可以按原样用于上述情况 - 除非您想要其他行为,否则无需覆盖它。