IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android的js互调,如何在webView加载前给web传值 -> 正文阅读

[移动开发]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前端的代码:

111.png

可以看到有句代码是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);

    }
};

最后需求解决。如果对你有帮助,可以帮忙赞一个。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:44:08  更:2022-03-04 15:45:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:40:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码