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

       最近项目涉及到android和前端交互,前端页面点击按钮跳转到新的页面,该页面存在业务逻辑判断,如果业务逻辑不符合会弹出一个对话框,当点击对话框的确定按钮后,整个新开的页面会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()方法的回调.

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Android 中,WebView 是一个内置的浏览器控件,可以加载网页并在应用程序中显示。WebView 与 JavaScript 的交互是常见的需求,主要有以下几种方式: 1. 通过 WebView 中的 loadUrl() 方法调用 JavaScript 函数。 可以使用 WebView 的 loadUrl() 方法加载一个包含 JavaScript 代码的 URL,实现与 JavaScript 的交互。例如,在 JavaScript 中定义一个函数: ```javascript function showToast(message) { alert(message); } ``` 然后在 Android 中使用 loadUrl() 方法调用这个函数: ```java webView.loadUrl("javascript:showToast('Hello World!')"); ``` 2. 在 WebView 中启用 JavaScript,并使用 addJavascriptInterface() 方法将 Java 对象注入到 JavaScript 中。 可以在 WebView 中启用 JavaScript 支持,并使用 addJavascriptInterface() 方法将 Java 对象注入到 JavaScript 中。这样,JavaScript 就可以调用 Java 对象的方法。例如,在 Java 中定义一个类: ```java public class MyJavaScriptInterface { private Context context; public MyJavaScriptInterface(Context context) { this.context = context; } @JavascriptInterface public void showToast(String message) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } } ``` 然后在 WebView 中启用 JavaScript 支持,并将 MyJavaScriptInterface 对象注入到 JavaScript 中: ```java webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new MyJavaScriptInterface(this), "Android"); ``` 在 JavaScript 中就可以调用 MyJavaScriptInterface 对象的 showToast() 方法: ```javascript Android.showToast("Hello World!"); ``` 3. 使用 evaluateJavascript() 方法执行 JavaScript 代码并获取返回值。 可以使用 WebView 的 evaluateJavascript() 方法执行 JavaScript 代码,并通过回调函数获取返回值。例如,在 JavaScript 中定义一个函数: ```javascript function add(a, b) { return a + b; } ``` 然后在 Android 中使用 evaluateJavascript() 方法执行这个函数,并获取返回值: ```java webView.evaluateJavascript("add(1, 2)", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // value = "3" } }); ``` 以上就是 WebView 与 JavaScript 的交互方式,开发者可以根据需求选择适合自己的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值