webview与js交互,window.close()回调方法onCloseWindow()无效的解决方法

来源:互联网 发布:关于喝酒的网络歌曲 编辑:程序博客网 时间:2024/06/15 00:42

       最近项目涉及到android和前端交互,前端页面点击按钮跳转到新的页面,该页面存在业务逻辑判断,如果业务逻辑不符合会弹出一个对话框,当点击对话框的确定按钮后,整个新开的页面会close.

       查阅网上的资料后我的代码是这样的:

        在我自定义的MyWebChromeClient中,重写了onCreateWindow()和onCloseWindow().

        参照网上资料

@Overridepublic void onCloseWindow(WebView window) {    super.onCloseWindow(window);    if (webView !=null){        relativeLayout.removeView(webView);    }    Log.e("log", "log");}
发现日志并不会出现.看起来好像前端调用window.close后并没有反应.

       经过自己不断尝试发现在我们的MyWebChromeClient中重写onCloseWindow()是不对的,因为在这里我们打开了一个新的窗口,而这个onCloseWindow()应该是关闭本身的窗口的时候才会走这个回调,而我们要关闭的是新开的页面窗口.所以在onCreateWindow()中我加入了下面的代码:

@Overridepublic boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {     webView = new WebView(activity);    WebSettings webSettings = webView.getSettings();    webSettings.setLoadWithOverviewMode(true);    webSettings.setDomStorageEnabled(true);    webSettings.setJavaScriptEnabled(true);    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);    webSettings.setAppCacheEnabled(false);//是否使用缓存    webSettings.setSupportMultipleWindows(true);    webSettings.setAllowContentAccess(true);    RelativeLayout.LayoutParams vlp = new RelativeLayout.LayoutParams(            RelativeLayout.LayoutParams.MATCH_PARENT,            RelativeLayout.LayoutParams.MATCH_PARENT);    vlp.addRule(RelativeLayout.BELOW,R.id.top);    vlp.addRule(RelativeLayout.ABOVE,R.id.workdetail_bottom);    webView.setLayoutParams(vlp);    relativeLayout.addView(webView);    webView.setWebChromeClient(new WebChromeClient(){        @Override        public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {            AlertDialog.Builder b2 = new AlertDialog.Builder(activity)                    .setTitle("报装信息").setMessage(message)                    .setPositiveButton("确定",                            new AlertDialog.OnClickListener() {                                @Override                                public void onClick(DialogInterface dialog,                                                    int which) {                                    result.confirm();                                }                            });            b2.setCancelable(false);            b2.create();            b2.show();            return true;        }        @Override        public void onCloseWindow(WebView window) {            super.onCloseWindow(window);            if (webView !=null){                relativeLayout.removeView(webView);            }            Log.e("log", "log");        }    });    webView.setWebViewClient(new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            view.loadUrl(url);            return true;        }    });    WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;    transport.setWebView(webView);    resultMsg.sendToTarget();    return true;}
       在onCreateWindow中我们创建了一个新的Webview,对它进行初始化设置之后设置webview.setWebChromeClient(),在这个方法中的webChromeClient中重写onCloseWindow(),这样的话才是在新的页面关闭的时候能响应window.close()方法的回调.

       因为查阅网上资料发现并没有对这种情况的例子说得很清楚,所以本博客作为资料补充,希望能对其他人有所参考帮助.

原创粉丝点击