setWebViewClient与setWebChromeClient有什么区别?


Answers:


148

源代码

// Instance of WebViewClient that is the client callback.
private volatile WebViewClient mWebViewClient;
// Instance of WebChromeClient for handling all chrome functions.
private volatile WebChromeClient mWebChromeClient;

// SOME OTHER SUTFFF.......

/**
 * Set the WebViewClient.
 * @param client An implementation of WebViewClient.
 */
public void setWebViewClient(WebViewClient client) {
    mWebViewClient = client;
}

/**
 * Set the WebChromeClient.
 * @param client An implementation of WebChromeClient.
 */
public void setWebChromeClient(WebChromeClient client) {
    mWebChromeClient = client;
}

使用WebChromeClient可以处理Javascript对话框,图标,标题和进度。看一下这个示例:向WebView添加alert()支持

乍一看,WebViewClientWebChromeClient之间有太多差异。但是,基本上:如果您要开发不需要太多功能但呈现HTML的WebView,则可以使用WebViewClient。另一方面,如果您想(例如)加载要呈现的页面的图标,则应使用WebChromeClient对象并覆盖onReceivedIcon(WebView view, Bitmap icon)

大多数时候,如果您不想担心那些事情……您可以这样做:

webView= (WebView) findViewById(R.id.webview); 
webView.setWebChromeClient(new WebChromeClient()); 
webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(url); 

并且您的WebView(理论上)将实现所有功能(作为android本机浏览器)。


26
以这种形式,答案是不完整的。ChromeClient可以处理枚举的事物,但是什么是ViewClient?有什么异同?
Pentium10'5

3
此方法是否有助于改善默认Webview的某些较差功能?尤其是对于CSS3动画和转场?
Ata Iravani 2012年

1
我可以一次使用两个吗?
谢尔盖·迪林

1
@SergeyDirin:stackoverflow.com/a/6475858。请参考此答案,您可以同时使用两者。
hoangtu23'7

如果没有chrome,如何在webviewclient中处理相机的权限?
j2emanue '18

99

我觉得这个问题需要更多细节。我的答案受到Android编程《书呆子牧场指南》(第二版)的启发。

默认情况下,JavaScript在WebView中处于​​关闭状态。您并非总是需要打开它,但是对于某些应用程序,可能确实需要它。

必须在配置WebView之后完成URL的加载,因此您最后要这样做。在此之前,您可以通过调用getSettings()获取WebSettings的实例并调用来打开JavaScript WebSettings.setJavaScriptEnabled(true)。WebSettings是修改WebView的三种方法中的第一种。它具有您可以设置的各种属性,例如用户代理字符串和文本大小。

之后,您配置WebViewClient。WebViewClient是事件接口。通过提供自己的WebViewClient实现,您可以响应呈现事件。例如,您可以检测渲染器何时开始从特定的URL加载图像,或者确定是否向服务器重新提交POST请求。

WebViewClient有许多可以覆盖的方法,其中大多数将不涉及。但是,您确实需要替换默认的WebViewClient的实现shouldOverrideUrlLoading(WebView, String)。此方法确定在WebView中加载新URL时会发生什么情况,例如通过按链接。如果返回true,则表示“不要处理此URL,我自己处理。” 如果返回false,则表示:“继续加载该URL,WebView,我对此不做任何事情。”

就像您之前所做的那样,默认实现会使用URL触发隐式意图。但是,现在这将是一个严重的问题。一些Web应用程序要做的第一件事是将您重定向到网站的移动版本。使用默认的WebViewClient,这意味着您将立即发送到用户的默认Web浏览器。这就是您要避免的事情。修复很简单–只需覆盖默认实现并返回false。

使用WebChromeClient整理内容 由于您花时间创建自己的WebView,因此,通过添加进度条并使用加载页面的标题更新工具栏的副标题来整理内容。

要连接ProgressBar,您将在WebView上使用第二个回调:WebChromeClient

WebViewClient是用于响应渲染事件的接口;WebChromeClient是事件接口,用于对应更改浏览器周围chrome元素的事件做出反应。其中包括JavaScript警报,网站图标,当然还有用于加载进度和当前页面标题的更新。

将其连接onCreateView(…)。使用WebChromeClient进行改进,进度更新和标题更新分别具有自己的回调方法, onProgressChanged(WebView, int)onReceivedTitle(WebView, String)。您收到的进度onProgressChanged(WebView, int)是0到100之间的整数。如果是100,则说明页面已完成加载,因此可以通过将ProgressBar的可见性设置为来隐藏该进度栏View.GONE

免责声明:该信息取自《 Android编程:大书呆子牧场指南》,经作者许可。有关本书的更多信息或要购买副本,请访问bignerdranch.com。


11
我认为这是一个比公认的更好的答案。
redbeam_'Apr 9'18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.