7.3.7 浏览器控件
浏览器控件android.webkit.WebView,是构造Android系统浏览器的核心控件,用来呈现HTML页面的控件,它的实现依托于开源库WebKit。
WebView派生自android.widget.AbsoluteLayout类,从继承结构来看是一种容器控件;但从使用上来看,它并不能用来承载其他子控件,而是用于单独展示内容。
使用WebView.loadUrl函数可以在浏览器控件中加载给定的页面,通过URL可以指向一个Web地址,也可以指向一个本地文件,比如:
//加载一个web地址
webView.loadUrl("http://flyvenus.net");
//加载本地文件,file:///android_asset指向本地应用的asset目录
webView.loadUrl("file:///android_asset/example.html");
除此之外,使用WebView.loadDataWithBaseURL函数可以用来加载存放在内存中的HTML页面[1],比如:
//加载内存中的页面信息
webView.loadDataWithBaseURL("file:///android_asset/",
htmlBuffer,"text/html","utf-8",null);
其中,函数的第一个参数baseUrl用于指明页面的基础路径。如果Web页面中包含了相对路径,或者是需要支持锚点,则会依照该基础路径进行计算,如果不设定,页面中就不能使用任何相对路径信息。
浏览器控件还支持JavaScript的解析。在默认设置下,对JavaScript的支持是关闭的,可以通过android.webkit.WebSettings对象来开启:
webview.getSettings().setJavaScriptEnabled(true);
更令人称道的是,Android的浏览器控件不仅支持原生的JavaScript,还支持用Java代码来编写的JavaScript函数,帮助不熟悉JavaScript的开发者用Java来实现相应的功能:
//将Java编写的Javascript方法与webview进行绑定
webView.addJavascriptInterface(new Object(){
public void sayHello(){
webView.loadUrl("javascript:alert('hello');");
}
},"myJsObject");
//加载Web页面demo.html,其内容是:
//<html>
//<a onClick="window.myJsObject.sayHello()">你好</a>
//</html>
webView.loadUrl("file:///android_asset/demo.html");
除此之外,通过WebSettings对象还可以改变浏览器控件对象的其他属性,比如页面的缩放比例、字体大小、默认图片显示、排版算法,等等。
为了更好地了解和掌控浏览器控件对象的工作状态,开发者可以构造android.webkit.WebViewClient对象来监听控件的各个事件,进而控制浏览器控件的行为。比如,如果期望阻止浏览器控件对象加载某个URL的内容,可以重载WebViewClient.shouldOverrideUrlLoading函数来实现:
webView.setWebViewClient(new WebViewClient(){
boolean shouldOverrideUrlLoading(WebView view,
String url){
return isNeedLoad(url);
}
});
[1]WebView.loadData也可以用于加载内存中的Web页面,但该函数对于utf-8编码的支持不佳,在实践中可以不考虑使用。