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

Kotlin新手求助:深色模式下重置按钮失效问题排查及修复

问题排查与修复方案

核心问题

你的resetbutton点击事件监听器被嵌套在了buttonclick的点击事件内部,这就导致只有在第一次点击计数按钮后,重置按钮的监听器才会被注册。这就是初始状态下重置按钮无效、点击计数后才恢复正常的根本原因,和深色模式无关。

修复后的完整代码

private lateinit var countertxt: TextView
private lateinit var buttonclick: Button
private lateinit var resetbutton: Button
private var num = 0

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

    countertxt = findViewById(R.id.countertxt)
    buttonclick = findViewById(R.id.buttonclick)
    resetbutton = findViewById(R.id.resetbtn)

    // 计数按钮的点击逻辑
    buttonclick.setOnClickListener {
        num++
        countertxt.text = num.toString()
        playSound()
    }

    // 重置按钮的点击逻辑,移到计数按钮监听器外部,确保初始化时就注册
    resetbutton.setOnClickListener {
        num = 0
        countertxt.text = num.toString()
        playSound()
    }
}

// 抽取重复的音效播放逻辑,减少代码冗余
private fun playSound() {
    val mediaPlayer = MediaPlayer.create(this, R.raw.sound)
    mediaPlayer.start()
    mediaPlayer.setOnCompletionListener {
        // 原代码无禁用buttonclick的逻辑,此处启用操作可移除,按需添加即可
        // buttonclick.isEnabled = true
        mediaPlayer.release()
    }
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putInt("SavedInt", num)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    num = savedInstanceState.getInt("SavedInt", 0)
    countertxt.text = num.toString()
}

额外优化说明

  1. 把重复的音效播放逻辑抽成独立函数playSound(),避免代码重复
  2. 移除了未使用的private lateinit var mediaPlayer: MediaPlayer变量,因为每次播放都创建了局部实例
  3. 原代码中buttonclick.isEnabled = true没有对应的禁用操作,可根据需求添加(比如点击计数按钮时先禁用,音效播放完成后再启用)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:42:37