android的js互调,如何在webView加载前给web传值

前言: 今天做项目遇到个问题。需求是: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前端的代码:
android的js互调,如何在webView加载前给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); } };

【android的js互调,如何在webView加载前给web传值】最后需求解决。如果对你有帮助,可以帮忙赞一个。

    推荐阅读