WebView浏览网页:
main.xml文件内容如下:
prom_dialog.xml文件内容如下:
activity代码如下:
android提供了WebView控件专门用来浏览网页,和其他控件一样,它使用起来非常简单。首先需要在xml布局文件中定义一个WebView控件,代码如下:
<WebView
android:id="@+id/webview01"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
然后在程序中装载这个控件,设置其属性,比如:颜色、字体、要访问的网址等(当然可以在xml中定义),下面的代码通过loadUrl方法设置了当前WebView需要访问的网址:
mWebView = (WebView)findViewById(R.id.webview01);
mWebView.loadUrl("http://www.baidu.com");
在android中专门通过WebSettings来设置WebView的一些属性、状态等。在创建WebView时,系统有一个默认的设置,我们可以通过WebView.getSettings来得到这个设置。代码如下:
//取得mWebView的WebSettings对象
WebSettings webSettings = mWebView.getSettings();
WebSettings和WebView都在同一个生命周期中存在,当WebView被销毁后,如果在使用WebSettings则会抛出IllegalStateException。
通过上述方法就可以浏览网页了,但是是通过调用系统浏览器来完成的。那么如何才能在应用程序中自定义网页浏览程序呢,可以通过使用WebViewClient来完成这个功能。
WebViewClient就是专门辅助WebView处理各种通知、请求等事件的类。我们可以通过WebView的setWebViewClient方法来指定一个WebViewClient对象。代码如下(我们设置覆盖shouldOverrideUrlLoading方法,使得当有新连接时,使用当前的WebView来显示):
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
通过WebViewClient可以浏览网页的大部分内容,但是现在很多网页中使用了javascript脚本语言,比如用javascript实现的对话框。这时该如何处理呢?android中提供另一个终于的类WebChromeClient,专门用来辅助WebView处理javascript的对话框、网站图标、网站title、加载进度等。
下面通过一个实际的例子来看一下WebView是怎样处理javascript的对话框的。首先需要一个资源文件dialog.html,内容如下:
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>分别测试javascript的三种对话框</title>
<script language="javascript">
function ale()
{
alert("这是一个警告对话框!");
}
function firm()
{
if(confirm("去百度看看?"))
{
location.href="http://www.baidu.com";
}
else
{
alert("你选择了不去!");
}
}
function prom()
{
var str=prompt("演示一个带输入的对话框","这里输入你的信息");
if(str)
{
alert("谢谢使用,你输入的是:"+ str)
}
}
</script>
</head>
<body>
<p>下面我们演示3种对话框</p>
<p>警告、提醒对话框</p>
<p>
<input type="submit" name="Submit" value="提交" οnclick="ale()" />
</p>
<p>带选择的对话框</p>
<p>
<input type="submit" name="Submit2" value="提交" οnclick="firm()" />
</p>
<p>要求用户输入的对话框</p>
<p>
<input type="submit" name="Submit3" value="提交" οnclick="prom()" />
</p>
</body>
</html>
main.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button01"
/>
<EditText
android:id="@+id/edittext01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<WebView
android:id="@+id/webview01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
prom_dialog.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical" >
<TextView
android:id="@+id/TextView_PROM"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/EditText_PROM"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollHorizontally="true"
android:selectAllOnFocus="true" />
</LinearLayout>
activity代码如下:
package com.android;
import android.view.View.OnClickListener;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.URLUtil;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
private final String TAG = "MainActivity";
private Button mButton;
private EditText mEditText;
private WebView mWebView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton = (Button)findViewById(R.id.button01);
mEditText = (EditText)findViewById(R.id.edittext01);
mWebView = (WebView)findViewById(R.id.webview01);
//设置支持javascript脚本
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
//设置可以访问文件
webSettings.setAllowFileAccess(true);
//设置支持缩放
webSettings.setBuiltInZoomControls(true);
//设置WebViewClient
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
});
//设置WebChromeClient
mWebView.setWebChromeClient(new WebChromeClient(){
//处理javascript中的alert
@Override
public boolean onJsAlert(WebView view, String url, String message,
final JsResult result) {
//构架一个builder来显示网页中的对话框
Builder builder = new Builder(MainActivity.this);
builder.setTitle("提示对话框");
builder.setMessage(message);
builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
//点击确定按钮之后,继续执行网页中的操作
result.confirm();
}
});
builder.setCancelable(false);
builder.create();
builder.show();
return true;
}
//处理javascript中的confirm
@Override
public boolean onJsConfirm(WebView view, String url,
String message, final JsResult result) {
Builder builder = new Builder(MainActivity.this);
builder.setTitle("待选择的对话框");
builder.setMessage(message);
builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
});
builder.setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
});
builder.setCancelable(false);
builder.create();
builder.show();
return true;
}
//处理javascript中的prompt
//message为网页中对话框的提示内容
//defaultValue为没有输入时默认显示的内容
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, final JsPromptResult result) {
//自定义一个带输入的对话框由TextView和Edittext构成
final LayoutInflater factory = LayoutInflater.from(MainActivity.this) ;
final View dialogView = factory.inflate(R.layout.prom_dialog, null);
//设置TextView对应网页中的提示信息
((TextView)dialogView.findViewById(R.id.TextView_PROM)).setText(defaultValue);
//设置EditText对应网页中的输入框
((EditText)dialogView.findViewById(R.id.EditText_PROM)).setText(defaultValue);
Builder builder = new Builder(MainActivity.this);
builder.setTitle("带输入的对话框");
builder.setView(dialogView);
builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 点击确定之后,取得输入的值,传给网页处理
String value = ((EditText)dialogView.findViewById(R.id.EditText_PROM)).getText().toString();
result.confirm(value);
}
});
builder.setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
});
builder.setOnCancelListener(new AlertDialog.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
result.cancel();
}
});
builder.show();
return true;
}
//设置网页的加载的进度条
@Override
public void onProgressChanged(WebView view, int newProgress) {
MainActivity.this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress);
super.onProgressChanged(view, newProgress);
}
//设置应用程序的标题title
@Override
public void onReceivedTitle(WebView view, String title) {
MainActivity.this.setTitle(title);
super.onReceivedTitle(view, title);
}
});
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try{
//取得编辑框中输入的内容
String url = mEditText.getText().toString();
//判断输入的内容是不是网址
if(URLUtil.isNetworkUrl(url)){
//装载网址
mWebView.loadUrl(url);
}else{
mEditText.setText("输入网址错误");
}
}catch (Exception e) {
Log.e(TAG, e.toString());
}
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if((keyCode==KeyEvent.KEYCODE_BACK) && (mWebView.canGoBack())){
//返回前一个页面
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}