在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;   
  
/**  
 * 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);   
    }   
} 
从容是一种态度。
原文地址:https://www.cnblogs.com/yume2015/p/3102021.html