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="提交" onclick="ale()" />
- </p>
- <p>带选择的对话框</p>
- <p>
- <input type="submit" name="Submit2" value="提交" onclick="firm()" />
- </p>
- <p>要求用户输入的对话框</p>
- <p>
- <input type="submit" name="Submit3" value="提交" onclick="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);
- }
- }