2010-05-14 66 views

回答

119

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对话框,网站图标,标题和进度。看一下这个例子:Adding alert() support to a WebView

乍一看,有太多的区别WebViewClient & WebChromeClient。但是,基本上:如果您正在开发不需要太多功能但呈现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本机浏览器)。

+20

在这种形式下,答案是不完整的。 ChromeClient允许处理列举的东西,但ViewClient是什么,以及它们之间的相似之处和不同点? – Pentium10 2010-05-14 16:18:55

+3

此方法是否有助于改进默认webview的一些不好的功能? 特别是对于css3动画和转换? – 2012-12-22 12:00:23

+2

我不这么认为。 – Cristian 2012-12-23 00:13:00

19

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

默认情况下,,JavaScript在WebView中关闭。你并不总是需要它,但对于某些应用程序,可能需要它。

加载URL必须在配置完WebView后完成,所以最后要做。在此之前,您通过调用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的隐式意图,就像您之前做的一样。但现在,这将是一个严重的问题。某些Web应用程序所做的第一件事是将您重定向到网站的移动版本。使用默认的WebViewClient,这意味着您可以立即发送到用户的默认Web浏览器。这正是你想要避免的。 修复很简单 - 只需重写默认实现并返回false。

使用WebChromeClient云杉东西 既然你正在创建自己的WebView,让我们通过添加一个进度条,并与加载页面的标题更新工具栏上的字幕云杉它一点时间。

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

WebViewClient是一个响应渲染事件的接口; WebChromeClient是一个事件接口,用于响应那些应该改变浏览器周围铬元素的事件。这包括JavaScript警报,网站图标,当然还有更新加载进度和当前页面的标题。

挂在onCreateView(…)。使用WebChromeClient修饰事物 进度更新和标题更新每个都有自己的回调方法, onProgressChanged(WebView, int)onReceivedTitle(WebView, String)。您从onProgressChanged(WebView, int)收到的进度是一个从0到100的整数。如果它是100,那么您知道 页面已完成加载,因此通过将ProgressBar的可见性设置为View.GONE来隐藏ProgressBar。

免责声明:这一信息是取自Android的程序设计:大书呆子牧场指南从作者的许可。欲了解更多 有关此书的信息或购买副本,请访问 bignerdranch.com。