Answers:
从源代码:
// 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()支持
乍一看,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本机浏览器)。
我觉得这个问题需要更多细节。我的答案受到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。