1.1 Android WebView 一些基本概念
开发过程中应该注意:
1.AndroidManifest.xml 中必须使用许可android.permission.INTERNET
.否则会出Web page not available错误
2.如果访问的页面中有javascript,则WebView必须设置支持javascript
WebView.setSettings().setJavaScriptEnable(true);
3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webView的WebViewClient对象
wv1.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub view.loadUrl(url); return true; } });
4.如果不做任何处理,浏览网页,点击系统back键,整个browser会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if ((keyCode == KeyEvent.KEYCODE_BACK) && wv1.canGoBack()) { wv1.goBack(); return true; } return super.onKeyDown(keyCode, event); }
下面来了解一下android中webView是如何支持javascript自定义对象的,在w3c标准中js有window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以为所欲为了。
看一个实例
public class MainActivity extends Activity { private WebView wv1; private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); wv1 = (WebView) findViewById(R.id.wv); WebSettings webSettings = wv1.getSettings(); webSettings.setJavaScriptEnabled(true); wv1.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub wv1.loadUrl("javascript: wave()"); } }); } }, "demo"); wv1.loadUrl("file:///android_asset/demo.html"); } }
在assets目录下加入demo.html文件
<html> <mce: script language="javascript"> </mce: script> <body> <a onClick="window.demo.clickOnAndroid()"> <img id="droid" src="ic_launcher.png" mce_src="ic_launcher.png"/><br> Click me! </a> </body> </html>
效果:
我们来看看addJavascriptInterface(Object object, String name)这个方法
该方法将一个Java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global,这样初始化后,在WebView加载的页面中就可以通过javascript:window.demo访问到绑定的java对象了
javascript中就可以调用java对象的clickOnAndroid()方法了,同样,我们可以在此对象中定义很多方法,
注意:
1.为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为“file://android_asset/",WebView遇到这样 的schema就去当前包中的assets目录中找内存
2.addJavascriptInterface方法中要绑定的java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用handler的目的。
1.2 Android WebView 组件的使用详情
网络内容
- loadUrl 直接显示网页内容(单独显示网络图片)
- loadData 显示中文网页内容(含空格的处理)
APK 包含文件 - LoadUrl显示APK中Html和图片文件
- LoadData(loadDataWithBaseURL)显示APK中图片和文字混合的Html内容
package com.example.demo2; import java.net.URLEncoder; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; @SuppressLint("JavascriptInterface") public class MainActivity extends Activity { final String mimeType = "text/html"; final String encoding = "utf-8"; WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.wv); webView.getSettings().setJavaScriptEnabled(true); webHtml(); webImage(); localHtmlZh(); localHtmlBlankSpace(); localHtmlImage(); }
/***
* 显示本地图片和文字混合的html内容
*/
private void localHtmlImage() {
// TODO Auto-generated method stub
try {
String data = "测试本地图片和文字混合显示,这是APK里的图片";
// SDK1.5本地文件处理(不能显示图片)
// webView.loadData(URLEncoder.encode(data, encoding), mimeType,
// encoding);
// SDK1.6及以后版本
webView.loadData(data, mimeType, encoding);
// 本地文件处理(能显示图片)
webView.loadDataWithBaseURL("about: blank", data, mimeType,
encoding, "");
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 中文显示(空格的处理)
*/
private void localHtmlBlankSpace() {
// TODO Auto-generated method stub
try {
String data = "测试含有空格的Html数据";
webView.loadData(URLEncoder.encode(data, encoding), mimeType,
encoding);
webView.loadData(data, mimeType, encoding);
webView.loadData(
URLEncoder.encode(data, encoding).replaceAll("+", " "),
mimeType, encoding);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 中文显示
*/
private void localHtmlZh() {
// TODO Auto-generated method stub
try {
String data = "测试含有中文的html数据";
// WebView.loadData(data, mimeType, encoding);
webView.loadData(URLEncoder.encode(data, encoding), mimeType,
encoding);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 直接网络图片显示
*/
private void webImage() {
// TODO Auto-generated method stub
try {
webView.loadUrl("http://h.hiphotos.baidu.com/image/w%3D230/sign=648d06b8a41ea8d38a227307a70b30cf/38dbb6fd5266d0165e532f2b952bd40735fa356e.jpg");
} catch (Exception ex) {
ex.printStackTrace();
}
}
/*
* 直接显示网页
*/
private void webHtml() {
// TODO Auto-generated method stub
try {
webView.loadUrl("http://www.baidu.com");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}