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) } }
关键修改说明
- 移除abstract关键字:让MainActivity可以正常被系统实例化,启动应用时不会报错。
- 新增currentDiceResId变量:专门用来保存当前显示的骰子资源ID,既方便点击按钮时更新,也方便状态的保存与恢复。
- 重写正确的onSaveInstanceState:使用仅带
Bundle参数的版本,把当前的骰子资源ID存入Bundle,确保横竖屏切换时状态能被临时保存。 - 修复rollingDice逻辑:将when表达式的结果赋值给currentDiceResId,确保ImageView能正确获取到要显示的图片资源。
- 添加状态恢复逻辑:在onCreate里判断savedInstanceState是否不为空,如果有保存的数据,就取出并设置ImageView的资源,恢复切换前的骰子状态。
这样修改后,横竖屏切换时,当前显示的骰子图片就不会被重置了。
内容的提问来源于stack exchange,提问作者Deepak Mathur
相关产品推荐
相关产品推荐

