前言: 明天做我的项目遇到个问题。需要是: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); } };
最初需要解决。如果对你有帮忙,能够帮忙赞一个。