Android中setWebViewClient
与setWebChromeClient
的区别是什么?
答案 0 :(得分:136)
来自source code:
// 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对话框,favicon,标题和进度。看一下这个例子:Adding alert() support to a WebView
乍一看,差异太大WebViewClient& WebChromeClient。但是,基本上:如果您正在开发一个WebView,它不需要太多功能而是渲染HTML,那么您只需使用WebViewClient
即可。另一方面,如果您想(例如)加载要渲染的页面的favicon,则应使用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本机浏览器)。
答案 1 :(得分:56)
我觉得这个问题需要更多细节。我的回答来自Android编程,The Nerd Ranch指南(第2版)。
默认情况下,在WebView中关闭JavaScript。您并不总是需要启用它,但对于某些应用程序,可能需要它。
在配置WebView之后,必须完成加载URL,所以最后这样做。在此之前,您可以通过调用getSettings()
来启用JavaScript以获取WebSettings的实例并调用WebSettings.setJavaScriptEnabled(true)
。 WebSettings是您可以修改WebView的三种方法中的第一种。它具有您可以设置的各种属性,例如用户代理字符串和文本大小。
之后,配置WebViewClient。 WebViewClient是一个事件接口。通过提供自己的WebViewClient实现,您可以响应呈现事件。例如,您可以检测渲染器何时开始从特定URL加载图像,或者决定是否向服务器重新提交POST请求。
WebViewClient 有许多方法可以覆盖,其中大部分都是你不会处理的。但是,您需要替换默认的WebViewClient的shouldOverrideUrlLoading(WebView, String)
实现。此方法确定在WebView中加载新URL时将发生的情况,例如按下链接。如果你返回true,你会说,“不要处理这个URL,我自己处理它。”如果你返回false,你会说,“继续加载这个URL,WebView,我没有做任何事情用它。”
默认实现使用URL触发隐式intent,就像您之前所做的那样。但现在,这将是一个严重的问题。某些Web应用程序所做的第一件事就是将您重定向到该网站的移动版本。使用默认的WebViewClient,这意味着您将立即发送到用户的默认Web浏览器。这正是您要避免的。 修复很简单 - 只需覆盖默认实现并返回false。
使用WebChromeClient进行修饰 由于您正在花时间创建自己的WebView,让我们通过添加进度条并使用已加载页面的标题更新工具栏的副标题来进行修改。
要连接ProgressBar,您将在WebView上使用第二个回调:WebChromeClient
。
WebViewClient是一个用于响应呈现事件的接口; WebChromeClient是一个事件接口,用于响应应该在浏览器周围更改chrome元素的事件。这包括JavaScript警报,favicon,当然还包括加载进度和当前页面标题的更新。
将其连接到onCreateView(…)
。使用WebChromeClient来改进
进度更新和标题更新每个都有自己的回调方法,
onProgressChanged(WebView, int)
和onReceivedTitle(WebView, String)
。您从onProgressChanged(WebView, int)
收到的进度是0到100之间的整数。如果它是100,您就知道了
页面已完成加载,因此您可以通过将其可见性设置为View.GONE
来隐藏ProgressBar。
免责声明:此信息来自Android编程:The Big Nerd Ranch指南,获得作者许可。更多 有关本书的信息或购买副本,请访问 bignerdranch.com。
答案 2 :(得分:1)
如果要从网页记录错误,则应使用WebChromeClient
并覆盖其onConsoleMessage
:
webView.settings.apply {
javaScriptEnabled = true
javaScriptCanOpenWindowsAutomatically = true
domStorageEnabled = true
}
webView.webViewClient = WebViewClient()
webView.webChromeClient = MyWebChromeClient()
private class MyWebChromeClient : WebChromeClient() {
override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
Timber.d("${consoleMessage.message()}")
Timber.d("${consoleMessage.lineNumber()} ${consoleMessage.sourceId()}")
return super.onConsoleMessage(consoleMessage)
}
}
答案 3 :(得分:0)
WebViewClient提供了以下回调方法,您可以通过它们使用10
5 5
2 3
10 1
10 2
20 20
-128 2
10 -128
-1 -1
10 0
0 2
过渡到下一个 content 。
WebView
WebChromeClient提供了以下回调方法,您的void doUpdateVisitedHistory (WebView view, String url, boolean isReload)
void onFormResubmission (WebView view, Message dontResend, Message resend)
void onLoadResource (WebView view, String url)
void onPageCommitVisible (WebView view, String url)
void onPageFinished (WebView view, String url)
void onPageStarted (WebView view, String url, Bitmap favicon)
void onReceivedClientCertRequest (WebView view, ClientCertRequest request)
void onReceivedError (WebView view, int errorCode, String description, String failingUrl)
void onReceivedError (WebView view, WebResourceRequest request, WebResourceError error)
void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm)
void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse)
void onReceivedLoginRequest (WebView view, String realm, String account, String args)
void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)
boolean onRenderProcessGone (WebView view, RenderProcessGoneDetail detail)
void onSafeBrowsingHit (WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback)
void onScaleChanged (WebView view, float oldScale, float newScale)
void onTooManyRedirects (WebView view, Message cancelMsg, Message continueMsg)
void onUnhandledKeyEvent (WebView view, KeyEvent event)
WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
WebResourceResponse shouldInterceptRequest (WebView view, String url)
boolean shouldOverrideKeyEvent (WebView view, KeyEvent event)
boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request)
boolean shouldOverrideUrlLoading (WebView view, String url)
或Activity
可以使用它们来更新Fragment
的周围环境。
WebView