使用 WebView 处理javascript的常用对话框

WebView浏览网页:
    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);
    }
}


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值