【Android进阶篇】WebView显示网页详解
概述
WebView
是Android
用于显示网页的控件。通过WebView
,我们可以查看本地的网页,也可以查看网络资源。
本文内容如下:
- 加载本地网页
- 加载网络资源
- 在
WebView
中使用JavaScript
和CSS
WebChromeClient
介绍WebView
的其它功能
一、加载本地网页
使用WebView
加载本地网页时,需要把网页放到Android
项目根目录下assets
文件夹下,然后URL
为:file:///android_asset/
文件。
下面是示例:
1. 首先创建工程,这步简单;
2. 在activity_main
界面文件中放好WebView
控件,代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mywebview.MainActivity" >
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
3. 创建文件Hello.html
,放在assets
文件夹下,hello.html
内容如下:
<!DOCTYPE html>
<html>
<head><title>Hello</title></head>
<body>
Hello, WebView
</body>
</html>
只显示了一行:Hello, WebView
4. 下面是MainActivity
代码:
public class MainActivity extends ActionBarActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
webView = (WebView) findViewById(R.id.webView);
//装载URL
webView.loadUrl("file:///android_asset/hello.html");
//获取焦点
webView.requestFocus();
}
}
5. 运行后可看到结果如图:
加载本地文件非常简单,我们只要获取到控件后,使用loadUrl
这个方法,WebView
就自动地去把文件装载到界面里并进行解析。当然,我们的Demo
也相当简单,没有用到js
、css
等文件。下面介绍一下如何访问网络URL。
二、访问网络资源
访问网络资源会稍微复杂一点。我们不仅需要设置URL
,而且需要在AndroidMainfest
里申请网络权限,最重要的一点,我们需要设置WebViewClient
,即用什么应用打开一个URL
,如果我们不设置,这个URL
就不会被我们的WebView
装载,而是由系统浏览器装载。下面来看一下示例,我们先看不设置WebViewClient
的:
下面是MainActivity
的部分代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
webView = (WebView) findViewById(R.id.webView);
//装载URL
webView.loadUrl("http://www.baidu.com/");
//获取焦点
webView.requestFocus();
}
还需要在AndroidManifest
中申请网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
运行后,界面效果为:
应用会要我们选择使用什么浏览器打开URL,而不是就使用我们自己的WebView。
下面我们在MainActivity中加上设置WebViewClient的语句,WebViewClient是负责接收处理请求和通知(可以直接通过Eclipse的Open Declaration的方法看源码的注释):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取控件
webView = (WebView) findViewById(R.id.webView);
// 装载URL
webView.loadUrl("http://www.baidu.com/");
// 设置WebViewClient来接收处理请求和通知
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
// 返回true则表明使用的是WebView
return true;
}
});
// 获取焦点
webView.requestFocus();
}
运行后,结果为:
这就是上网成功了。
三、在WebView
中使用JavaScript
和CSS
在WebView
中使用css
文件很容易,只需要在Html
中引入一下或写一些style
代码就好;但JavaScript
就要多一点工作了。
在WebView
中使用JavaScript
,我们首先需要使用WebSettings
给WebView
启动JavaScript
功能,然后才能使用。另外,在JavaScript
中很多功能在WebView
中不能直接使用,比如常用的alert
就不行,我们需要自己来实现,这个等下再讲。下面我们来实现在WebView
中使用JavaScript
和CSS
。
首先创建一个css
文件style.css
,和Hello.html
文件位于同一目录,内容如下:
body {
background:#bbbbbb;
color:red;
}
Hello.html
文件内容作一些修改:
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk">
<link rel="stylesheet" href="style.css"></link>
<title>Hello</title></head>
</style>
<body>
<div id="x">Hello, WebView<div>
</body>
<script>
var obj = document.getElementById("x");
obj.innerHTML = "你好"; //将"Hello, WebView"改为"你好"
alert("你好");
console.log("你好");
</script>
</html>
如果成功执行,则"Hello, WebView
"将改为"你好",可以先去尝试一下。下面在MainActivity
给WebView
启用JavaScript
:
public class MainActivity extends ActionBarActivity {
private WebView webView;
private String localFile = "file:///android_asset/hello.html";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取控件
webView = (WebView) findViewById(R.id.webView);
// 装载URL
webView.loadUrl(localFile);
// 设置WebViewClient来接收处理请求和通知
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
// 返回true则表明使用的是WebView
return true;
}
});
//WebSettings负责管理WebView的一些状态,生命周期与WebView一致
//在WebView生成时同时生成
WebSettings settings = webView.getSettings();
//使用WebSettings启用JavaScript
settings.setJavaScriptEnabled(true);
// 获取焦点
webView.requestFocus();
}
}
运行后结果:
JavaScript
和CSS
成功执行(alert
除外,并没有弹出对话框)
注:html
代码里面我设置的编码是GBK
,这是因为我的Eclipse
默认编码是GBK
,所以一定要设置好自己对应的编码,不然中文会是乱码。
四、 WebChromeClient
介绍
WebChromeClient
,Chrome
处理器,我们可以通过webView.setWebChromeClient(client)
来设置,它是一个很重要的组件。通过这个组件我们可以实现JavaScript
中的对话框(即alert
)、网页加载进度条等。下面通过这个组件就来实现一下上文没能响应的alert
函数以及在JavaScript
调试过程中十分重要的console.log()
函数。实现的方式就是在对应的方法里将JavaScript
函数转换为Android
里的组件实现。
MainActivity
代码如下,细节写在了注释里:
//设置WebChromeClient
webView.setWebChromeClient(new WebChromeClient(){
/**
* 实现console.log():既然是日志,自然是用Android里的Log.d来实现
*/
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
// 直接输出信息即可
Log.d("JavaScript", consoleMessage.message());
return true;
}
/**
* 实现alert(), 其实只要使用了WebChromeClient就有默认实现
* 不过我们是以学习为目的,来学一下自己定制吧
*/
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
//创建Android对话框来输出信息
AlertDialog.Builder b = new AlertDialog.Builder(MainActivity.this)
.setTitle("JavaScript对话框").setMessage(message)
.setPositiveButton("ok",
new AlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
result.confirm();
dialog.dismiss();
}
});
b.create(); //创建对话框
b.show(); //显示对话框
return true;
}
});
日志输出:
Demo
截图:
因为在Html
中早就写好了aler
t和console.log
,只是当时没有执行,所以不用修改其它的。从截图可看出,已经成功实现了alert
和console.log
。
如果想知道WebChromeClient
还可以实现哪些功能,可以直接查看源码。
五、WebView
的其它功能
WebView
还有很多其它的功能,就不一一列举了,上述只讲了几个我觉得比较重要的,还有比如回退、前进、查看历史记录、设置WebView
缓存等功能也是很重要的方法。