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

Android新手求助:接收JS消息切换Activity时遇Unresolved reference @MainActivity错误

解决WebView JS交互跳转Activity的引用错误

错误原因

你定义的JsObject是WebViewActivity的内部类,却错误使用了this@MainActivity来获取Context——当前外部类是WebViewActivity而非MainActivity,编译器无法识别这个引用。另外,默认的内部类是静态的,无法直接访问外部Activity实例,也会导致Context获取失败。

修复方案

  1. 将JsObject改为内部类(inner class),使其能持有外部WebViewActivity的引用;
  2. 把this@MainActivity替换为this@WebViewActivity,使用当前Activity作为跳转的Context;
  3. 直接调用Activity的startActivity方法完成跳转。

修改后的完整代码

package io.github.g00fy2.quickiesample
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.webkit.JavascriptInterface
import android.webkit.WebView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat

class WebViewActivity : AppCompatActivity() {
    // 改为inner class,持有外部Activity引用
    inner class JsObject {
        @JavascriptInterface
        fun msg(): String {
            return "From Android!"
        }

        @JavascriptInterface
        fun postMsg(msg: String) {
            // 使用WebViewActivity的实例作为Context创建Intent
            val mainActivityIntent = Intent(this@WebViewActivity, MainActivity::class.java)
            mainActivityIntent.putExtra("postMsg", msg)
            // 调用Activity的startActivity方法完成跳转
            startActivity(mainActivityIntent)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        WindowCompat.setDecorFitsSystemWindows(window, false)
        setContentView(R.layout.activity_web_view) // 替换成你的布局ID
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        // 初始化WebView并绑定JS接口
        val webView = findViewById<WebView>(R.id.web_view) // 从布局获取WebView
        webView.settings.javaScriptEnabled = true
        webView.addJavascriptInterface(JsObject(), "AndroidBridge") // 命名JS调用的桥接对象
        // 加载HTML页面(示例为本地assets文件)
        webView.loadUrl("file:///android_asset/test.html")
    }
}

额外注意事项

  • 确保MainActivity已在AndroidManifest.xml中注册,否则跳转会失败;
  • JS中调用Android方法示例:window.AndroidBridge.postMsg("Hello from JS!");
  • 开启javascriptEnabled存在安全风险,正式环境建议配合WebViewClient做域名校验,避免恶意页面注入。

内容的提问来源于stack exchange,提问作者Larry K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:41:09