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

Android Studio中使用Kotlin开发掷骰子应用时,实现横竖屏切换保存当前骰子图片状态的方法

解决Kotlin掷骰子应用横竖屏状态丢失问题

我帮你梳理代码里的几个关键问题,一步步修复横竖屏切换时骰子状态重置的问题:

代码里的核心问题

  • MainActivity被错误声明为抽象类:abstract class MainActivity会导致系统无法实例化这个Activity,直接去掉abstract关键字。
  • result变量未正确定义:你只写了lateinit var result,但没有指定类型,而且没有正确关联到骰子资源ID的赋值逻辑。
  • onSaveInstanceState重写错误:你重写了带PersistableBundle的重载方法,而横竖屏切换时系统会调用仅带Bundle参数的版本,这个才是用来临时保存状态的。
  • rollingDice函数逻辑漏洞:你的when表达式只是返回了资源ID,但没有赋值给result,导致showingResult.setImageResource(result)会报错,因为result根本没被赋值。
  • 缺少状态恢复逻辑:在onCreate里没有读取savedInstanceState中保存的数据,所以切换横竖屏后不会恢复之前的骰子状态。

修正后的完整代码

package com.example.rollingdice

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.ImageView
import kotlin.random.Random

class MainActivity : AppCompatActivity() {
    lateinit var showingResult: ImageView
    lateinit var diceButton: Button
    // 声明变量保存当前显示的骰子资源ID,默认显示骰子1
    private var currentDiceResId: Int = R.drawable.dice_1

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

        diceButton = findViewById(R.id.rollDice)
        showingResult = findViewById(R.id.iv)

        // 恢复横竖屏切换前保存的状态
        savedInstanceState?.let {
            currentDiceResId = it.getInt("img")
            showingResult.setImageResource(currentDiceResId)
        }

        diceButton.setOnClickListener {
            rollingDice()
        }
    }

    // 重写正确的状态保存方法
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // 把当前显示的骰子资源ID存入Bundle
        outState.putInt("img", currentDiceResId)
    }

    private fun rollingDice() {
        val number: Int = Random.nextInt(6) + 1
        // 将when匹配到的资源ID赋值给currentDiceResId
        currentDiceResId = when (number) {
            1 -> R.drawable.dice_1
            2 -> R.drawable.dice_2
            3 -> R.drawable.dice_3
            4 -> R.drawable.dice_4
            5 -> R.drawable.dice_5
            else -> R.drawable.dice_6
        }
        showingResult.setImageResource(currentDiceResId)
    }
}

关键修改说明

  1. 移除abstract关键字:让MainActivity可以正常被系统实例化,启动应用时不会报错。
  2. 新增currentDiceResId变量:专门用来保存当前显示的骰子资源ID,既方便点击按钮时更新,也方便状态的保存与恢复。
  3. 重写正确的onSaveInstanceState:使用仅带Bundle参数的版本,把当前的骰子资源ID存入Bundle,确保横竖屏切换时状态能被临时保存。
  4. 修复rollingDice逻辑:将when表达式的结果赋值给currentDiceResId,确保ImageView能正确获取到要显示的图片资源。
  5. 添加状态恢复逻辑:在onCreate里判断savedInstanceState是否不为空,如果有保存的数据,就取出并设置ImageView的资源,恢复切换前的骰子状态。

这样修改后,横竖屏切换时,当前显示的骰子图片就不会被重置了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:02:44