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

旋转屏幕时保留Activity状态报错,无需配置Manifest可行吗?

无需Manifest配置实现Android旋转屏幕状态保存的可行方案
  • 完全可行,onSaveInstanceState 结合 onCreate 或 onRestoreInstanceState 是Google官方推荐的、无需修改Manifest的状态保存方案,你出现报错大概率是用法存在问题,常见错误点包括:

    • 未调用 super.onSaveInstanceState(outState):跳过系统默认的状态保存逻辑,可能导致基础控件状态丢失或触发异常
    • 保存了不支持的数据类型:Bundle仅支持可序列化(Serializable)或可Parcelable(Parcelable)的对象,自定义对象未实现这两个接口会直接报错
    • 恢复状态时未判空:直接读取null的savedInstanceState会引发空指针异常
  • 正确用法示例(以Kotlin为例):

    1. 保存状态:
      override fun onSaveInstanceState(outState: Bundle) {
          super.onSaveInstanceState(outState)
          // 保存基础数据类型
          outState.putString("current_input", editText.text.toString())
          // 保存自定义对象(需实现Parcelable接口)
          outState.putParcelable("user_info", currentUser)
      }
      
    2. 恢复状态:
      方式一:在onCreate中处理
      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)
          // 先判断savedInstanceState是否不为空
          savedInstanceState?.run {
              val savedInput = getString("current_input")
              val savedUser = getParcelable<UserInfo>("user_info")
              // 恢复UI状态或数据
              editText.setText(savedInput)
          }
      }
      
      方式二:重写onRestoreInstanceState
      override fun onRestoreInstanceState(savedInstanceState: Bundle) {
          super.onRestoreInstanceState(savedInstanceState)
          val savedInput = savedInstanceState.getString("current_input")
          val savedUser = savedInstanceState.getParcelable<UserInfo>("user_info")
          editText.setText(savedInput)
      }
      
  • 进阶方案:如果是复杂页面状态,推荐使用ViewModel组件,它会自动在屏幕旋转时保留数据,无需手动操作Bundle,同样不需要修改Manifest配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:42:13