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

Android Studio Kotlin报错:MyWebview类无无参构造函数

问题原因

Android系统启动Activity时,会通过反射调用无参构造函数实例化Activity组件。你的MyWebview类只定义了带参数的构造函数,导致系统无法创建实例,因此抛出has no zero argument constructor错误。另外,你手动new MyWebview的方式完全错误——Activity不能通过手动实例化启动,必须由系统通过Intent管理创建。

解决方案

核心修正点

  1. 给MyWebview添加系统必需的无参构造函数
  2. 放弃构造函数传参,改用Intent的Extra字段传递URL和返回页信息

修改后的完整代码

MyWebview类

class MyWebview : AppCompatActivity() {
    // 定义Extra键常量,统一管理参数标识
    companion object {
        const val EXTRA_TARGET_URL = "extra_target_url"
        const val EXTRA_BACK_PAGE_CLASS = "extra_back_page_class"
    }

    private lateinit var targetUrl: String
    private lateinit var backPageClass: Class<*>
    private val webview: WebView by lazy { findViewById(R.id.webview) }
    private val closeButton: TextView by lazy { findViewById(R.id.close_webview) }

    // 系统要求的无参构造函数
    constructor() : super()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_web_view)

        // 从Intent中取出传递的参数
        targetUrl = intent.getStringExtra(EXTRA_TARGET_URL) ?: ""
        backPageClass = intent.getSerializableExtra(EXTRA_BACK_PAGE_CLASS) as Class<*>

        initWebView()
        setupCloseButton()
    }

    private fun initWebView() {
        webview.webViewClient = WebViewClient()
        webview.apply {
            loadUrl(targetUrl)
            settings.javaScriptEnabled = true
            settings.safeBrowsingEnabled = true
            settings.allowContentAccess = true
        }
    }

    private fun setupCloseButton() {
        closeButton.setOnClickListener {
            startActivity(Intent(this, backPageClass))
        }
    }

    override fun onBackPressed() {
        if (webview.canGoBack()) {
            webview.goBack()
        } else {
            super.onBackPressed()
        }
    }
}

MainActivity调用代码

iButton.setOnClickListener {
    val intent = Intent(this, MyWebview::class.java)
    // 传入目标URL
    intent.putExtra(MyWebview.EXTRA_TARGET_URL, "https://www.google.com/")
    // 传入返回页的Class对象(Class默认实现Serializable,可直接传递)
    intent.putExtra(MyWebview.EXTRA_BACK_PAGE_CLASS, MainActivity::class.java)
    startActivity(intent)
}

补充说明

  • 若传递自定义对象而非Class<*>,需让对象实现Serializable或Parcelable接口
  • 建议在获取Extra时添加空值判断逻辑,避免空指针异常(示例中用?: ""处理URL空值,实际项目可根据需求添加错误提示)

内容的提问来源于stack exchange,提问作者Harvey Xie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:01:22