常见问题
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;
}
});
如有问题,欢迎指正。
网友评论