webview与js交互,window.close()回调方法onCloseWindow()无效的解决方法
2017-07-25 13:55
441 查看
最近项目涉及到android和前端交互,前端页面点击按钮跳转到新的页面,该页面存在业务逻辑判断,如果业务逻辑不符合会弹出一个对话框,当点击对话框的确定按钮后,整个新开的页面会close.
查阅网上的资料后我的代码是这样的:
在我自定义的MyWebChromeClient中,重写了onCreateWindow()和onCloseWindow().
参照网上资料
发现日志并不会出现.看起来好像前端调用window.close后并没有反应.
经过自己不断尝试发现在我们的MyWebChromeClient中重写onCloseWindow()是不对的,因为在这里我们打开了一个新的窗口,而这个onCloseWindow()应该是关闭本身的窗口的时候才会走这个回调,而我们要关闭的是新开的页面窗口.所以在onCreateWindow()中我加入了下面的代码:
在onCreateWindow中我们创建了一个新的Webview,对它进行初始化设置之后设置webview.setWebChromeClient(),在这个方法中的webChromeClient中重写onCloseWindow(),这样的话才是在新的页面关闭的时候能响应window.close()方法的回调.
因为查阅网上资料发现并没有对这种情况的例子说得很清楚,所以本博客作为资料补充,希望能对其他人有所参考帮助.
查阅网上的资料后我的代码是这样的:
在我自定义的MyWebChromeClient中,重写了onCreateWindow()和onCloseWindow().
参照网上资料
@Override public void onCloseWindow(WebView window) { super.onCloseWindow(window); if (webView !=null){ relativeLayout.removeView(webView); } Log.e("log", "log"); }
发现日志并不会出现.看起来好像前端调用window.close后并没有反应.
经过自己不断尝试发现在我们的MyWebChromeClient中重写onCloseWindow()是不对的,因为在这里我们打开了一个新的窗口,而这个onCloseWindow()应该是关闭本身的窗口的时候才会走这个回调,而我们要关闭的是新开的页面窗口.所以在onCreateWindow()中我加入了下面的代码:
@Override
public 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()方法的回调.
因为查阅网上资料发现并没有对这种情况的例子说得很清楚,所以本博客作为资料补充,希望能对其他人有所参考帮助.
相关文章推荐
- 如何让安卓WebView支持js调用window.open()和window.close()的方法。
- Webview与js交互漏洞及解决方法(有注释代码)
- webview加载页面,JS方法不能加载的问题解决
- Android实用方法—webview的JS交互
- WebView在API 17后调addJavascriptInterface方法无效的解决办法
- android webView js方法和java 方法交互
- android之通过webview实现与js方法相互调用,数据交互
- android studio混淆打包,解决webview和js的交互问题
- iOS 几种webView与JS交互的方法
- 解决Android签名混淆后WebView与JS交互失效的问题
- android webView js方法和java 方法交互
- Android WebView使用方法详解 附js交互调用方法
- android webview与js交互时遇到的问题解决
- Uncaught TypeError: window.jsObj.closeWebView is not a function
- android Webview中注入js,用于解决第三方页中出现返回事件window.history.go(-1),无法响应问题
- android webview 中localStorage无效的解决方法
- webview js 与java代码交互问题(成员变量名 和方法名不能重名 啃爹啊)
- android webView js方法和java 方法交互
- Android 中 WebView 与 js 简单交互实现图文混排效果,解决图片自适应屏幕与查看大图问题
- android webView js方法和java 方法交互