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

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

我的理解正确吗?

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

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

【问题讨论】:

    标签: android webview webviewclient webchromeclient


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

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多