WebViewClient 和 WebChromeClient 是互斥的吗?

Posted

技术标签:

【中文标题】WebViewClient 和 WebChromeClient 是互斥的吗?【英文标题】:Are WebViewClient and WebChromeClient mutually exclusive? 【发布时间】:2011-09-22 10:02:05 【问题描述】:

从这个great explanation关于WebViewClientWebChromeClient之间的区别看来,如果你使用一个,你不应该使用另一个(对于同一个WebView对象)。

我的理解正确吗?

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

有没有这样的例子,只使用WebViewClient WebChromeClient 用于同一个WebView 对象可以实现某个目标?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我的真正意思是一个情况的例子,而不是代码。 :) 除非出现更好的答案,否则接受。 @ef2011:假设您想将包含视频的页面加载到您的 web 视图中。但是该页面由 htaccess 文件保护。因此,要进行身份验证,您需要使用 setWebViewClient 并使用您的凭据覆盖其 onReceivedHttpAuthRequest() 方法。然后你想播放视频....但结果视频没有播放!也许它通过JS控制。或者它需要一个插件。因此,为了充分利用内容和更好的 JS 支持,您还需要 setWebChromeClient()。我的看法:setWebViewClient 用于基本的 HTTP 浏览器内容,setWebChromeClient 用于与内容相关的操作和支持。 我同意@ef2011。此注释比上面的代码示例更清晰。 也许有点晚了,但我提供了另一个用例。 :) 我想知道为什么 Android 团队不以简单、清晰和易于理解的方式记录这些内容。【参考方案2】:

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

例如,如果您想:

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

跟踪加载进度

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

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

【讨论】:

以上是关于WebViewClient 和 WebChromeClient 是互斥的吗?的主要内容,如果未能解决你的问题,请参考以下文章

WebViewClient 与 WebChromeClient

如何连接 webviewclient 和 Chromeweb 视图客户端

Android WebViewClient,有404时不会调用onErrorReceived

WebViewClient将数据返回到Activity onPageFinished

Android WebViewClient 回调调用过于频繁

使用 Android WebViewClient 启用特定 SSL 协议