Android中的setWebViewClient
vs. 之间的区别是什么setWebChromeClient
?
从源代码:
// 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,标题和进度.看一下这个例子:向WebView添加alert()支持
乍一看,WebViewClient和WebChromeClient存在太多差异.但是,基本上:如果你正在开发一个不需要太多功能但是渲染HTML的WebView,你可以使用一个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本机浏览器).
我觉得这个问题需要更多细节.我的回答来自Android编程,The Nerd Ranch Guide(第2版).
默认情况下,JavaScript在WebView中处于关闭状态.您并不总是需要它,但对于某些应用程序,可能需要它.
加载URL必须在配置WebView后完成,所以最后这样做.在此之前,您通过调用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触发隐式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,您知道页面已完成加载,因此您可以通过将其可见性设置为隐藏ProgressBar View.GONE
.
免责声明:此信息取自Android编程:The Big Nerd Ranch Guide,获得作者许可.有关本书的更多信息或购买副本,请访问bignerdranch.com.