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编码的支持不佳,在实践中可以不考虑使用。