Android WebView

2022-07-17  本文已影响0人  和尚无花

常见问题

js调用android方法和传递参数

binding.webView.getSettings().setJavaScriptEnabled(true); // 设置支持javascript脚本
binding.webView.addJavascriptInterface(new JsBackI(), "android");  // 向webview注册一个Java对象, android为对象名称,js中会使用,JsBackI为自定义的注入JavaScript的Java类
 class JsBackI {
        @JavascriptInterface
        public void returnBack(String value) {
             //根据value值写自己的逻辑
              // **这里的value,如果js端直接传递对象是接收不到的,需要转化成json字符串传递。** 参数可以是多参数
        }
}

shouldOverrideUrlLoading不被调用问题

解决方式:h5使用window.open。android 端适配window.open。
参考代码:

      //设置
        binding.webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//支持js调用window.open方法
        binding.webView.getSettings().setAllowFileAccess(true);// 设置允许访问文件数据
         binding.webView.getSettings().setSupportMultipleWindows(true);// 设置允许开启多窗口
        binding.webView.getSettings().setDomStorageEnabled(true);// 
         binding.webView.getSettings().setJavaScriptEnabled(true);// 设置支持javascript

binding.webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
            }

            @Override
            public void onCloseWindow(WebView window) {
                super.onCloseWindow(window);
              
            }

            @Override
            public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {

                WebView newWebView = new WebView(mActivity); //新创建一个webview
                  newWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//支持js调用window.open方法
       newWebView.getSettings().setAllowFileAccess(true);// 设置允许访问文件数据
         newWebView.getSettings().setSupportMultipleWindows(true);// 设置允许开启多窗口
        newWebView.getSettings().setDomStorageEnabled(true);// 
         newWebView.getSettings().setJavaScriptEnabled(true);// 设置支持javascript
                newWebView.setWebViewClient(new WebViewClient() {
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            
                        gotoNewPage(request);  //添加自己的逻辑
                        return true;
                    }
                });
                newWebView.setWebChromeClient(this);
                //binding.root.addView(newWebView);//需要展示就把webview加载到activity界面上,不需要就不添加
                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;//以下的操作应该就是让新的webview去加载对应的url等操作。
                transport.setWebView(newWebView);
                resultMsg.sendToTarget();
                return true;
            }
        });

如有问题,欢迎指正。

上一篇下一篇

猜你喜欢

热点阅读