wangleyiang 发表于 2013-1-30 04:05:37

在Android的webview中定制js的alert,confirm和prompt对话框的方法

1.首先继承android.webkit.WebChromeClient实现MyWebChromeClient。
2.在MyWebChromeClient.java中覆盖onJsAlert,onJsConfirm,onJsPrompt三个方法。
3.在初始化Webview时设置调用webview.setWebChromeClient(new MyWebChromeClient());
4.在Webview载入的html中使用window.alert,window.confirm,window.prompt方法,系统弹出的将是自定义实现的对应对话框。
MyWebChromeClient.java的代码如下:
import android.app.AlertDialog;import android.content.DialogInterface;import android.content.DialogInterface.OnCancelListener;import android.content.DialogInterface.OnClickListener;import android.content.DialogInterface.OnKeyListener;import android.graphics.Bitmap;import android.os.Message;import android.util.Log;import android.view.KeyEvent;import android.webkit.JsPromptResult;import android.webkit.JsResult;import android.webkit.WebChromeClient;import android.webkit.WebView;import android.widget.EditText;public class MyWebChromeClient extends WebChromeClient {@Overridepublic void onCloseWindow(WebView window) {super.onCloseWindow(window);}@Overridepublic boolean onCreateWindow(WebView view, boolean dialog,boolean userGesture, Message resultMsg) {return super.onCreateWindow(view, dialog, userGesture, resultMsg);}/** * 覆盖默认的window.alert展示界面,避免title里显示为“:来自file:////” */@Overridepublic boolean onJsAlert(WebView view, String url, String message,JsResult result) {final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());builder.setTitle("lizongbo的Android webview测试alert对话 框").setMessage(message).setPositiveButton("确定", null);// 不需要绑定按键事件// 屏蔽keycode等于84之类的按键builder.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {Log.v("onJsAlert", "keyCode==" + keyCode + "event=" + event);return true;}});// 禁止响应按back键的事件builder.setCancelable(false);AlertDialog dialog = builder.create();dialog.show();result.confirm();// 因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。return true;}@Overridepublic boolean onJsBeforeUnload(WebView view, String url, String message,JsResult result) {return super.onJsBeforeUnload(view, url, message, result);}/** * 覆盖默认的window.confirm展示界面,避免title里显示为“:来自file:////” */@Overridepublic boolean onJsConfirm(WebView view, String url, String message,final JsResult result) {final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());builder.setTitle("Android webview测试confirm对话框").setMessage(message).setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.confirm();}}).setNeutralButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.cancel();}});builder.setOnCancelListener(new OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {result.cancel();}});// 屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题builder.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {Log.i("onJsConfirm", "keyCode==" + keyCode + "event=" + event);return true;}});// 禁止响应按back键的事件// builder.setCancelable(false);AlertDialog dialog = builder.create();dialog.show();return true;// return super.onJsConfirm(view, url, message, result);}/** * 覆盖默认的window.prompt展示界面,避免title里显示为“:来自file:////” * window.prompt('请输入您的域名地址', '618119.com'); */@Overridepublic boolean onJsPrompt(WebView view, String url, String message,String defaultValue, final JsPromptResult result) {final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());builder.setTitle("lizongbo的Android webview测试prompt对话框").setMessage(message);final EditText et = new EditText(view.getContext());et.setSingleLine();et.setText(defaultValue);builder.setView(et);builder.setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.confirm(et.getText().toString());}}).setNeutralButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.cancel();}});// 屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题builder.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {Log.i("onJsPrompt", "keyCode==" + keyCode + "event=" + event);return true;}});// 禁止响应按back键的事件// builder.setCancelable(false);AlertDialog dialog = builder.create();dialog.show();return true;// return super.onJsPrompt(view, url, message, defaultValue, result);}@Overridepublic void onProgressChanged(WebView view, int newProgress) {super.onProgressChanged(view, newProgress);}@Overridepublic void onReceivedIcon(WebView view, Bitmap icon) {super.onReceivedIcon(view, icon);}@Overridepublic void onReceivedTitle(WebView view, String title) {super.onReceivedTitle(view, title);}@Overridepublic void onRequestFocus(WebView view) {super.onRequestFocus(view);}} 原文连接:http://618119.com/archives/2010/12/20/199.html
页: [1]
查看完整版本: 在Android的webview中定制js的alert,confirm和prompt对话框的方法