zoukankan      html  css  js  c++  java
  • 在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);   
        }   
    } 
    从容是一种态度。
  • 相关阅读:
    【调查】用户眼中已经消亡的十大IT技术
    Asp.net Cache
    双卡已落伍 三卡三待全键盘手机亮相
    C#修改本机的IP,网关等网络地址的代码片段
    【ZT】实战.NET大规模网站架构:Web加速器
    【面霸】面试ERP实施顾问的三招“必杀技”
    数据库优化使用索引优化存储过程
    【備查】informix sql函数使用说明大全
    “8月3日我们要过男人节”
    Asp.Net网站优化:数据库索引优化
  • 原文地址:https://www.cnblogs.com/yume2015/p/3102021.html
Copyright © 2011-2022 走看看