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前端的代码:

可以看到有句代码是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传值 的全部内容, 来源链接: utcz.com/z/267605.html

回到顶部