You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Android WebView的addJavascriptInterface返回类变量(如表格对象)

Android WebView获取表格对象并直接操作的实现方案

核心限制说明

Android的addJavascriptInterface无法直接返回JS中的DOM对象(比如<table>),因为Java/Kotlin与JavaScript的运行环境完全隔离,原生代码无法直接持有JS的DOM实例。因此需要通过序列化DOM结构为原生可解析的结构化数据,再在原生端构建对应模型类,以此实现类似直接操作类变量的效果。

具体实现步骤

  • 1. 定义原生端的表格模型类
    在Kotlin中创建对应HTML表格结构的实体类,用于接收JS传递的序列化数据:

    // 表格行数据类
    data class TableRow(val innerText: String, val cells: List<String>)
    
    // 表格数据类
    data class HtmlTable(val rows: List<TableRow>)
    
  • 2. 通过JS序列化表格结构并传递给原生
    修改JS代码,将表格的行、单元格内容转换为JSON字符串,再通过交互接口传递给原生:

    // 获取目标表格
    const targetTable = document.getElementsByTagName('table')[0];
    // 序列化表格为结构化对象
    const tableData = {
      rows: Array.from(targetTable.querySelectorAll('tr')).map(tr => ({
        innerText: tr.innerText,
        cells: Array.from(tr.querySelectorAll('td, th')).map(cell => cell.innerText)
      }))
    };
    // 转成JSON字符串传给原生接口
    window.INTERFACE.receiveTable(JSON.stringify(tableData));
    
  • 3. 配置WebView并解析JSON数据
    在Android端配置WebView,绑定交互接口,并在接口方法中将JSON解析为定义好的模型类:

    // JS交互接口类
    class WebAppInterface(private val context: Context) {
        @JavascriptInterface
        fun receiveTable(tableJson: String) {
            // 使用Gson解析JSON为HtmlTable对象(需添加Gson依赖)
            val htmlTable = Gson().fromJson(tableJson, HtmlTable::class.java)
            
            // 现在可直接像操作类变量一样访问表格内容
            val firstRow = htmlTable.rows[0]
            val firstCellText = firstRow.cells[0]
            // 此处编写业务逻辑
        }
    }
    
    // 配置WebView
    webview?.run {
        settings.javaScriptEnabled = true
        // 绑定JS交互接口
        addJavascriptInterface(WebAppInterface(context), "INTERFACE")
        // 加载目标HTML页面
        loadUrl("file:///android_asset/your_target_page.html")
        // 页面加载完成后执行序列化表格的JS代码
        webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                evaluateJavascript("""
                    const targetTable = document.getElementsByTagName('table')[0];
                    const tableData = {
                      rows: Array.from(targetTable.querySelectorAll('tr')).map(tr => ({
                        innerText: tr.innerText,
                        cells: Array.from(tr.querySelectorAll('td, th')).map(cell => cell.innerText)
                      }))
                    };
                    window.INTERFACE.receiveTable(JSON.stringify(tableData));
                """.trimIndent(), null)
            }
        }
    }
    
  • 4. 补充说明

    • 若需修改表格后同步回JS,可在原生端修改模型类数据,再序列化为JSON字符串,通过evaluateJavascript传递给JS,由JS负责更新DOM。
    • 交互接口方法必须添加@JavascriptInterface注解,否则JS无法调用;同时务必开启WebView的JavaScript支持。

内容的提问来源于stack exchange,提问作者Lập Trình

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:07:04