我正在创建一个计算器应用程序。 每当用户更改设备的方向时,当前的应用程序活动就会被破坏并重新创建。因此,为了解决该问题(即取回所有数据),我这样做:
private const val STATE_OPERAND1 = "data"
private const val STATE_PENDING_OPERATION = "PENDING_OPERATION"
private const val STATE_OPERAND1_STORED = "data"
override fun onSaveInstanceState(outState: Bundle)
super.onSaveInstanceState(outState)
if (operand1 != null) {
outState.putDouble(STATE_OPERAND1, operand1!!)
outState.putBoolean(STATE_OPERAND1_STORED, true)
}
outState.putString(STATE_PENDING_OPERATION, pendingOperation)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
operand1 = if (savedInstanceState.getBoolean(STATE_OPERAND1_STORED, false))
savedInstanceState.getDouble(STATE_OPERAND1)
else
null
result.setText(operand1.toString()) // Marked Line 1
pendingOperation = savedInstanceState.getString(STATE_PENDING_OPERATION)
displayOperation.text = pendingOperation
}
不需要第3个代码中的“标记行1”,我添加的原因是为了找出错误。在此代码中, result 测试框清除了它以前的文本,并输入了文本“ null”。
但是,当我在1中更改声明时
从private const val STATE_OPERAND1 = "data"
到private const val STATE_OPERAND1 = "STATE_OPERAND1"
结果 文本框显示了应该输入的文本,并且一切正常。只要第一个代码中的所有三个声明都不同,该应用程序就可以工作。为什么会这样呢?
答案 0 :(得分:3)
带有初始声明:
private const val STATE_OPERAND1 = "data"
private const val STATE_OPERAND1_STORED = "data"
此行:
outState.putDouble(STATE_OPERAND1, operand1!!)
通过键Bundle
在Double
对象内部设置operand1!!
值"data"
。
下一行:
outState.putBoolean(STATE_OPERAND1_STORED, true)
通过键Bundle
在Boolean
对象内再次设置(覆盖)true
值"data"
。
结果是先前的Double
值现在丢失,并且唯一存在的值为新的Boolean
值。
因此,您只有一个Boolean
值。
当您更改为:
private const val STATE_OPERAND1 = "STATE_OPERAND1"
private const val STATE_OPERAND1_STORED = "data"
此冲突消失了,因为您有2个不同的键,并且正确保存了这2个值,而不会彼此覆盖。