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

Android屏幕旋转时onSaveInstanceState状态保存失效问题

问题原因

你代码的核心问题是覆写了错误的onSaveInstanceState方法重载:
你当前实现的双参数版本onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle),仅当Activity在Manifest中配置了android:persistableMode="persistAcrossReboots"属性时才会被系统调用,普通屏幕旋转触发的Activity重建流程不会走这个方法,导致你要保存的name变量根本没有被写入状态Bundle,重建后name始终为初始值null,点击getName自然无法正确填充内容。

修复方案
  • 删除现有双参数的onSaveInstanceState实现,覆写单参数版本的onSaveInstanceState(outState: Bundle),这才是屏幕旋转等配置变更时系统默认触发的状态保存方法。
  • 可选优化:可以直接在onCreate中读取savedInstanceState恢复name值,不需要单独在onRestoreInstanceState中处理,代码逻辑更集中。
  • 细节优化:KEY_NAME作为编译期常量建议加上const修饰,内部使用的方法建议加上private修饰符,代码更规范。
修复后完整代码
class MainActivity : AppCompatActivity() {
    private var name: String? = null
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 读取旋转前保存的name值
        name = savedInstanceState?.getString(KEY_NAME)

        binding.setButton.setOnClickListener { setName() }
        binding.getButton.setOnClickListener { getName() }
    }

    private fun getName(){
        binding.et1.setText(name)
    }

    private fun setName(){
        binding.tv1.text = binding.et1.text
        name = binding.tv1.text.toString()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // 屏幕旋转时会触发该方法,正确保存name值
        outState.putString(KEY_NAME, name)
    }

    companion object{
        private const val KEY_NAME = "NAME"
    }
}

补充说明:Android系统默认会对设置了id的EditText控件自动恢复旋转前的输入内容,如果你不需要额外的变量存储逻辑,甚至可以不用手动写onSaveInstanceState保存输入框内容,上述修复是完全匹配你描述的预期执行流程给出的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:21:20