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
相关产品推荐
相关产品推荐

