`

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

阅读更多
http://618119.com/archives/2010/12/20/199.html

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;

/**
 * http://618119.com/archives/2010/12/20/199.html
 */

//****************************************************************************
public class MyWebChromeClient extends WebChromeClient {
	@Override
	public void onCloseWindow(WebView window) {
		super.onCloseWindow(window);
	}

	@Override
	public boolean onCreateWindow(WebView view, boolean dialog,
			boolean userGesture, Message resultMsg) {
		return super.onCreateWindow(view, dialog, userGesture, resultMsg);
	}

	/**
	 * 覆盖默认的window.alert展示界面,避免title里显示为“:来自file:////”
	 */
	public boolean onJsAlert(WebView view, String url, String message,
			JsResult result) {
		final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
				
		builder.setTitle("对话框")
				.setMessage(message)
				.setPositiveButton("确定", null);
				
		// 不需要绑定按键事件
		// 屏蔽keycode等于84之类的按键
		builder.setOnKeyListener(new OnKeyListener() {
			public 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;
		// return super.onJsAlert(view, url, message, result);
	}

	public boolean onJsBeforeUnload(WebView view, String url,
			String message, JsResult result) {
		return super.onJsBeforeUnload(view, url, message, result);
	}

	/**
	 * 覆盖默认的window.confirm展示界面,避免title里显示为“:来自file:////”
	 */
	public boolean onJsConfirm(WebView view, String url, String message,
			final JsResult result) {
		final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
		builder.setTitle("对话框")
				.setMessage(message)
				.setPositiveButton("确定",new OnClickListener() {
							public void onClick(DialogInterface dialog,int which) {
								result.confirm();
							}
						})
				.setNeutralButton("取消", new OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						result.cancel();
					}
				});
		builder.setOnCancelListener(new OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				result.cancel();
			}
		});

		// 屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
		builder.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
				Log.v("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');
	 */
	public boolean onJsPrompt(WebView view, String url, String message,
			String defaultValue, final JsPromptResult result) {
		final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
				
		builder.setTitle("对话框").setMessage(message);
				
		final EditText et = new EditText(view.getContext());
		et.setSingleLine();
		et.setText(defaultValue);
		builder.setView(et)
				.setPositiveButton("确定", new OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						result.confirm(et.getText().toString());
					}
		
				})
				.setNeutralButton("取消", new OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						result.cancel();
					}
				});

		// 屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
		builder.setOnKeyListener(new OnKeyListener() {
			public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
				Log.v("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);
	}

	@Override
	public void onProgressChanged(WebView view, int newProgress) {
		super.onProgressChanged(view, newProgress);
	}

	@Override
	public void onReceivedIcon(WebView view, Bitmap icon) {
		super.onReceivedIcon(view, icon);
	}

	@Override
	public void onReceivedTitle(WebView view, String title) {
		super.onReceivedTitle(view, title);
	}

	@Override
	public void onRequestFocus(WebView view) {
		super.onRequestFocus(view);
	}
}
分享到:
评论
2 楼 mufaith 2014-07-30  
  
1 楼 鱼在陆地上跑 2012-08-14  
学习  

相关推荐

    android webView.pptx

    为了能够处理来自JavaScript的alert、confirm和prompt对话框,我们需要创建一个自定义的WebChromeClient: ```java class MyWebChromeClient extends WebChromeClient { // 覆盖方法 @Override public boolean...

    android中webview加载本地页面,并处理js事件

    - 使用`WebChromeClient`的`onJsAlert()`、`onJsConfirm()`和`onJsPrompt()`方法处理JavaScript的alert、confirm和prompt对话框。 - `WebView`还提供了`onJsBeforeLoad()`、`onJsTimeout()`等回调,可以监听...

    ANDROIDWEBVIEW中的JAVASCRIPT代码使用[参照].pdf

    为了正确处理JavaScript的`alert()`、`confirm()`和`prompt()`对话框,以及获取加载进度等信息,你需要为你的WebView设置一个`WebChromeClient`实例。例如: ```java myWebView.setWebChromeClient(new ...

    Android中WebView的JS交互的几种方式

    本篇将详细讲解在Android中使用WebView进行JS交互的几种常见方法,以及如何在实际项目中应用这些技术。 1. **注入JavaScript接口(JavaScript Interface)** Android提供了`addJavascriptInterface()`方法,允许...

    安卓浏览器WebViewJSHTML5相关-androidwebview加载本地html.zip

    `WebChromeClient`通常用于处理JavaScript的对话框(如alert、confirm、prompt)、进度信息以及文件选择器。而`WebViewClient`则用于拦截页面的加载事件,比如在页面加载开始、完成或出错时进行相应的处理。通过重写...

    android4.4 WebView与js交互

    3. **`WebViewChromeClient`**:在更复杂的情况下,可以使用`WebChromeClient`来处理JavaScript的异步调用,如`window.confirm()`、`window.prompt()`和`window.alert()`。通过重写`onJsPrompt()`、`onJsAlert()`和`...

    Android 和 javascript 交互 Android混合开发之WebView与Javascript交互

    你可以重写`onJsAlert`、`onJsConfirm`和`onJsPrompt`来处理JavaScript的alert、confirm和prompt对话框。 2. `WebViewClient`:主要负责页面加载过程中的事件,如页面开始加载、页面加载完成、错误处理等。重写`...

    AndroidWebView.rar

    - `WebChromeClient`:处理更复杂的交互,如弹出对话框、处理JavaScript的alert、confirm、prompt等。 3. **Android与WebView的交互**: - **Android调用JavaScript**:使用`WebView.loadUrl("javascript:your...

    android WebViewClient与WebChromeClient用法

    在Android应用开发中,WebView是一个重要的组件,它允许开发者在应用程序内部展示网页内容。而当涉及到与网页交互时,我们通常会用到WebViewClient和WebChromeClient这两个关键类。它们各自有不同的职责,协同工作以...

    android webview视频全屏等功能demo

    - WebChromeClient则处理更复杂的交互,比如提供对话框、加载进度、JavaScript的alert、confirm、prompt等。 3. **处理视频播放**: - 默认情况下,WebView可能不会自动全屏播放视频。我们需要重写...

    android和js交互demo

    2. **WebChromeClient**: 提供了与JavaScript交互的一些高级功能,如`onJsAlert()`、`onJsConfirm()`、`onJsPrompt()`用于处理JavaScript的alert、confirm和prompt对话框,以及`onProgressChanged()`跟踪网页加载...

    android捕获js中的dialog事件

    `android捕获js中的dialog事件`这个主题涉及到如何在Android的WebView组件中监听并处理JavaScript弹出的对话框,如alert、confirm和prompt。这篇博文链接指向的是ITEYE上的一篇博客,虽然具体内容无法在此提供,但...

    android中java和js互调

    总结,Java和JavaScript在Android中的互调涉及多个层面,包括`WebView`的使用、接口定义、客户端配置以及安全性控制。理解和熟练掌握这些知识点对于开发混合式应用至关重要。通过合理的使用,可以充分利用两者的优势...

    Android中java与js互调例子

    可以用来处理JavaScript的`prompt()`对话框,以及`WebChromeClient`的`onJsAlert()`和`onJsConfirm()`方法处理JavaScript的`alert()`和`confirm()`对话框。 最后,我们还可以通过`WebViewClient`的`...

    android与js交互实例

    例如,`WebChromeClient.onJsAlert()`、`onJsConfirm()`和`onJsPrompt()`可以捕获并处理JavaScript的alert、confirm和prompt对话框。 2. **postMessage和MessageChannel**:为了使JS能够调用Android,我们需要监听...

    Android 和 js调用桥

    2. **WebChromeClient**:更专注于提供高级的交互功能,如显示加载进度条、处理JavaScript的alert()、confirm()、prompt()对话框等。此外,WebChromeClient还提供了evaluateJavascript()方法,可以直接执行...

    简版android浏览器

    可以通过实现onProgressChanged方法来显示加载进度条,或者通过onJsAlert、onJsConfirm和onJsPrompt来处理JavaScript的alert、confirm和prompt对话框。 4. **网络请求处理**: 虽然WebView可以处理大部分的网页加载...

    Android与js交互

    我们可以通过重写`onJsAlert`、`onJsConfirm`和`onJsPrompt`方法来响应JavaScript的alert、confirm和prompt对话框。 2. `WebViewClient`: 主要负责处理页面加载的相关事件,如加载开始、加载结束等。我们可以通过...

    Android html5 js css调用测试例子.rar

     继承WebChromeClient类,在这个类的3个方法中,分别使用Android的内置控件重写了Js中对应的对话框,就是说对js中的对话框做处理了,就是重写了。  通过Android调用JS处理alert弹出框 、处理confirm弹出框、处理...

Global site tag (gtag.js) - Google Analytics