android:webview解析
在开发过程中应该注意几点:
1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Webpagenotavailable错误。
2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webview的WebViewClient对象。
mWebView.setWebViewClient(newWebViewClient(){
publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
view.loadUrl(url);
returntrue;
}
});
4.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if((keyCode==KeyEvent.KEYCODE_BACK)&&mWebView.canGoBack()){
mWebView.goBack();
returntrue;
}
returnsuper.onKeyDown(keyCode,event);
}
下一步让我们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以为所欲为了。
看一个实例:
viewplaincopytoclipboardprint?
01.publicclassWebViewDemoextendsActivity{
02.privateWebViewmWebView;
03.privateHandlermHandler=newHandler();
04.
05.publicvoidonCreate(Bundleicicle){
06.super.onCreate(icicle);
07.setContentView(R.layout.webviewdemo);
08.mWebView=(WebView)findViewById(R.id.webview);
09.WebSettingswebSettings=mWebView.getSettings();
10.webSettings.setJavaScriptEnabled(true);
11.mWebView.addJavascriptInterface(newObject(){
12.publicvoidclickOnAndroid(){
13.mHandler.post(newRunnable(){
14.publicvoidrun(){
15.mWebView.loadUrl("javascript:wave()");
16.}
17.});
18.}
19.},"demo");
20.mWebView.loadUrl("file:///android_asset/demo.html");
21.}
22.}
我们看addJavascriptInterface(Objectobj,StringinterfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。
<html>
<mce:scriptlanguage="javascript"><!--
functionwave(){
document.getElementById("droid").src="android_waving.png";
}
//--></mce:script>
<body>
<aonClick="window.demo.clickOnAndroid()">
<imgid="droid"src="android_normal.png"mce/><br>
Clickme!
</a>
</body>
</html>
这样在javascript中就可以调用java对象的clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用javascript的例子。
这里还有几个知识点:
1)为了让WebView从apk文件中加载assets,AndroidSDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的assets目录中找内容。如上面的"file:///android_asset/demo.html"
2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用Handler的目的。