前言: 今天做项目遇到个问题。需求是:webview在加载网页的时候,在网页渲染前给web传值,用于网页渲染?看完,你是不是很有兴趣?接下来我把js交互也详细总结一篇。希望对同学们有帮助。
一、android调用web上的方法
直接上代码吧:
binding.webViewX5.loadUrl("javascript:setDeviceData()");
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);
}
};
最后需求解决。如果对你有帮助,可以帮忙赞一个。
|