WebViewClient 和 WebChromeClient 是互斥的吗?
Posted
技术标签:
【中文标题】WebViewClient 和 WebChromeClient 是互斥的吗?【英文标题】:Are WebViewClient and WebChromeClient mutually exclusive? 【发布时间】:2011-09-22 10:02:05 【问题描述】:从这个great explanation关于WebViewClient
和WebChromeClient
之间的区别看来,如果你使用一个,你不应该使用另一个(对于同一个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