欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

Android WebView自定义重写js的alert和confirm对话框

程序员文章站 2022-03-01 13:23:26
...

在Amdroid应用开发过程中、经常会用到WebView去加载网页、个人一直觉得WebView的alert()对话框太丑了、所以自定义了WebView的对话框

方法是继承android.webkit.WebChromeClient实现MyWebChromeClient

在MyWebChromeClient.java中覆盖onJsAlert、onJsConfirm、onJsPrompt三个方法onJsPrompt方法可不覆盖、在初始化Webview时设置调用webview.setWebChromeClient(new MyWebChromeClient());

在Webview载入的html中使用window.alert,window.confirm,window.prompt方法、系统弹出的将是自定义实现的对应对话框、而不是系统自带的对话框


onJsAlert代码

/**  
 * 覆盖默认的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);  
}


onJsConfirm代码

/** 
 * 覆盖默认的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);  
}  


最后给贴上Demo的源代码、希望对大家有用、有兴趣的哥们可以下载看看

源代码下载链接: http://dwtedx.com/download.html?bdkey=s/1mgMS5ba 密码: k732