android捕获js中的dialog事件

来源:互联网 发布:农产品流通网络建设 编辑:程序博客网 时间:2024/06/16 01:33
 

来源google开源项目

http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/

我对其进行了修改,并加了简单的注释,这个例子的不仅是对js的操作,它还对android浏览器做了简单的介绍,
这些我会在注释中一一讲解。

Javascript弹出框有如下三种:

alert();     
window.confirm("Are you srue?");     
window.prompt("Please input some word";,"this is text");   
alert();  
window.confirm("Are you srue?");  
window.prompt("Please input some word";,"this is text");   

WebChromeClient 中对三种dialog进行了捕捉,但不幸的是,并没有回调函数可以使用,
或者说不能获得用户是点击“OK”还是“CANCEL”的操作结果。
个人以为,这些方法的设置是为了对一些涉及到html操作的应用程序进行测试时使用的。
在WebChromeClient中还有以下的方法:
onProgressChanged(WebView view, int newProgress);     
onReceivedIcon(WebView view, Bitmap icon);     
onReceivedTitle(WebView view, String title);     
onRequestFocus(WebView view);     
onCloseWindow(WebView window);     
onProgressChanged(WebView view, int newProgress)  
onProgressChanged(WebView view, int newProgress);  
onReceivedIcon(WebView view, Bitmap icon);  
onReceivedTitle(WebView view, String title);  
onRequestFocus(WebView view);  
onCloseWindow(WebView window);  
onProgressChanged(WebView view, int newProgress) 

这些方法的使用我会在以后的博文中讲到.
请大家先看今天讲解的重点
public class WebViewDemo extends Activity {     
    
    private static final String LOG_TAG = "WebViewDemo";     
    private WebView mWebView;     
    private TextView mReusultText ;     
    private Handler mHandler = new Handler();     
    
    @Override    
    public void onCreate(Bundle icicle) {     
    
        super.onCreate(icicle);     
        setContentView(R.layout.main);     
        //获得浏览器组件     
        //WebView就是一个简单的浏览器     
        //android浏览器源码存在于LINUX\android\package\apps\Browser中     
        //里面的所有操作都是围绕WebView来展开的     
        mWebView = (WebView) findViewById(R.id.webview);     
        mReusultText = (TextView) findViewById(R.id.resultText);     
        //WebSettings 几乎浏览器的所有设置都在该类中进行     
        WebSettings webSettings = mWebView.getSettings();     
        webSettings.setSavePassword(false);     
        webSettings.setSaveFormData(false);     
        webSettings.setJavaScriptEnabled(true);     
        webSettings.setSupportZoom(false);     
        mWebView.setWebChromeClient(new MyWebChromeClient());     
        /*   
         * DemoJavaScriptInterface类为js调用android服务器端提供接口   
         * android 作为DemoJavaScriptInterface类的客户端接口被js调用   
         * 调用的具体方法在DemoJavaScriptInterface中定义:   
         * 例如该实例中的clickOnAndroid   
         */    
        mWebView.addJavascriptInterface(new DemoJavaScriptInterface(),"androd");     
        mWebView.loadUrl("file:///android_asset/page.html");     
    }     
    
    final class DemoJavaScriptInterface {     
        DemoJavaScriptInterface() {}     
    
        /**   
         * 该方法被浏览器端调用   
         */    
        public void clickOnAndroid() {     
            mHandler.post(new Runnable() {     
                public void run() {     
                    //调用js中的onJsAndroid方法     
                    mWebView.loadUrl("javascript:onJsAndroid()");     
                }     
            });     
        }     
    }     
    
    /**   
     * 继承WebChromeClient类   
     * 对js弹出框时间进行处理   
     *    
     */    
    final class MyWebChromeClient extends WebChromeClient {     
    
        /**   
         * 处理alert弹出框   
         */    
        @Override    
        public boolean onJsAlert(WebView view,String url,     
                                 String message,JsResult result) {     
            Log.d(LOG_TAG,"onJsAlert:"+message");     
            mReusultText.setText("Alert:"+message);     
            //对alert的简单封装     
            new AlertDialog.Builder(WebViewDemo.this).     
                setTitle("Alert").setMessage(message).setPositiveButton("OK",     
                new DialogInterface.OnClickListener() {     
                    @Override    
                    public void onClick(DialogInterface arg0, int arg1) {     
                       //TODO     
                   }     
            }).create().show();     
            result.confirm();     
            return true;     
        }     
    
        /**   
         * 处理confirm弹出框   
         */    
        @Override    
        public boolean onJsConfirm(WebView view, String url, String message,     
                JsResult result) {     
            Log.d(LOG_TAG, "onJsConfirm:"+message);     
            mReusultText.setText("Confirm:"+message);     
            result.confirm();     
            return super.onJsConfirm(view, url, message, result);     
        }     
    
        /**   
         * 处理prompt弹出框   
         */    
        @Override    
        public boolean onJsPrompt(WebView view, String url, String message,     
                String defaultValue, JsPromptResult result) {     
            Log.d(LOG_TAG,"onJsPrompt:"+message);     
            mReusultText.setText("Prompt input is :"+message);     
            result.confirm();     
            return super.onJsPrompt(view, url, message, message, result);     
        }     
    }     
}   
public class WebViewDemo extends Activity {  
 
    private static final String LOG_TAG = "WebViewDemo";  
    private WebView mWebView;  
    private TextView mReusultText ;  
    private Handler mHandler = new Handler();  
 
    @Override 
    public void onCreate(Bundle icicle) {  
 
        super.onCreate(icicle);  
        setContentView(R.layout.main);  
        //获得浏览器组件  
        //WebView就是一个简单的浏览器  
        //android浏览器源码存在于LINUX\android\package\apps\Browser中  
        //里面的所有操作都是围绕WebView来展开的  
        mWebView = (WebView) findViewById(R.id.webview);  
        mReusultText = (TextView) findViewById(R.id.resultText);  
        //WebSettings 几乎浏览器的所有设置都在该类中进行  
        WebSettings webSettings = mWebView.getSettings();  
        webSettings.setSavePassword(false);  
        webSettings.setSaveFormData(false);  
        webSettings.setJavaScriptEnabled(true);  
        webSettings.setSupportZoom(false);  
        mWebView.setWebChromeClient(new MyWebChromeClient());  
        /* 
         * DemoJavaScriptInterface类为js调用android服务器端提供接口 
         * android 作为DemoJavaScriptInterface类的客户端接口被js调用 
         * 调用的具体方法在DemoJavaScriptInterface中定义: 
         * 例如该实例中的clickOnAndroid 
         */ 
        mWebView.addJavascriptInterface(new DemoJavaScriptInterface(),"androd");  
        mWebView.loadUrl("file:///android_asset/page.html");  
    }  
 
    final class DemoJavaScriptInterface {  
        DemoJavaScriptInterface() {}  
 
        /** 
         * 该方法被浏览器端调用 
         */ 
        public void clickOnAndroid() {  
            mHandler.post(new Runnable() {  
                public void run() {  
                    //调用js中的onJsAndroid方法  
                    mWebView.loadUrl("javascript:onJsAndroid()");  
                }  
            });  
        }  
    }  
 
    /** 
     * 继承WebChromeClient类 
     * 对js弹出框时间进行处理 
     *  
     */ 
    final class MyWebChromeClient extends WebChromeClient {  
 
        /** 
         * 处理alert弹出框 
         */ 
        @Override 
        public boolean onJsAlert(WebView view,String url,  
                                 String message,JsResult result) {  
            Log.d(LOG_TAG,"onJsAlert:"+message");  
            mReusultText.setText("Alert:"+message);  
            //对alert的简单封装  
            new AlertDialog.Builder(WebViewDemo.this).  
                setTitle("Alert").setMessage(message).setPositiveButton("OK",  
                new DialogInterface.OnClickListener() {  
                    @Override 
                    public void onClick(DialogInterface arg0, int arg1) {  
                       //TODO  
                   }  
            }).create().show();  
            result.confirm();  
            return true;  
        }  
 
        /** 
         * 处理confirm弹出框 
         */ 
        @Override 
        public boolean onJsConfirm(WebView view, String url, String message,  
                JsResult result) {  
            Log.d(LOG_TAG, "onJsConfirm:"+message);  
            mReusultText.setText("Confirm:"+message);  
            result.confirm();  
            return super.onJsConfirm(view, url, message, result);  
        }  
 
        /** 
         * 处理prompt弹出框 
         */ 
        @Override 
        public boolean onJsPrompt(WebView view, String url, String message,  
                String defaultValue, JsPromptResult result) {  
            Log.d(LOG_TAG,"onJsPrompt:"+message);  
            mReusultText.setText("Prompt input is :"+message);  
            result.confirm();  
            return super.onJsPrompt(view, url, message, message, result);  
        }  
    }  

 

   java代码如上所示,html页面代码放在code文件中,在这不做讲解。
在项目中有两个链接:

jsDemo为以上代码对应的html   
webDemo为google开源项目中的文件 
导入工程后请配置Build Path, sdk1.6以上版本均可兼容。
JavaEye下载地址:

http://dl.javaeye.com/topics/download/c8df945d-b5f5-3591-8e32-f70860ce8398