前言: 明天做我的项目遇到个问题。需要是:webview 在加载网页的时候,在网页渲染前给 web 传值,用于网页渲染?看完,你是不是很有趣味?接下来我把 js 交互也具体总结一篇。心愿对同学们有帮忙。
一、android 调用 web 上的办法
间接上代码吧:
// 无参调用,办法名为:setDeviceData;这里的参数为 json
binding.webViewX5.loadUrl("javascript:setDeviceData()");
// 有参数调用,办法名为:setDeviceData;参数为:json
binding.webViewX5.loadUrl("javascript:setDeviceData('" + json + "')");
二、web 调用 android 上的办法
2.1、步骤 1:
首先在咱们 webView 的 Activity 里定义个外部类,如下:
- test()就是 webView 要调用咱们的办法
- 留神 test 办法里有没有参数,有几个参数要和 web 调用的时候定义好
@SuppressLint("JavascriptInterface")
private class AndroidJavaScript {
Context mContxt;
public AndroidJavaScript(Context mContxt) {this.mContxt = mContxt;}
@JavascriptInterface
public void test(int value) {}}
2.2、步骤 2:
而后 addJavascriptInterface,在 loadUrl 前后都行。
binding.webViewX5.addJavascriptInterface(new AndroidJavaScript(WebMciActivity.this), "android");
binding.webViewX5.loadUrl(url);
这样就实现了,这个时候你可能要问 ”android” 是怎么来的,那么看一段 web 前端的代码:
能够看到有句代码是 window.android. 办法名。没错,这里 web 如果写的不是 android,那么在咱们 addJavascriptInterface 时候要和 web 前端保持一致
三、重点:如何在 webView 加载前给 web 传值呢。
问题是这样的:咱们要在 webView 渲染之前给 web 传值,用于 webView 渲染页面。比方咱们给 web 上的 testInfo 传值。如果 testInfo=1, 咱们就把开关关上,否则敞开开关。
在我大量试验下,终于找到办法了。代码用的啥不用说了必定是
- binding.webViewX5.loadUrl(“javascript:testInfo=1”);
- 留神下面代码是给 testInfo 传值 1 个常量 1。如果是传字符串或者 json bean 对象得用上面代码:
// 切记、通过了大量体力劳动,得出的论断!!binding.webViewX5.loadUrl("javascript:var deviceInfo='" + json + "'");
那问题是,这句代码应该在哪里执行呢。咱们都晓得 webView 有 2 个监听,其中一个是:
- setWebChromeClient(webChromeClient);
加载就在这个 webChromeClient 里。
private boolean isInit = true;
private WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {if (isInit){
isInit = false;
binding.webViewX5.loadUrl("javascript:testInfo=1");
}
}
@Override
public void onReceivedTitle(WebView webView, String s) {super.onReceivedTitle(webView, s);
}
};
最初需要解决。如果对你有帮忙,能够帮忙赞一个。