我的MainActivity.kt文件有什么问题?

时间:2019-05-28 16:51:30

标签: android kotlin

我正在创建一个计算器应用程序。 每当用户更改设备的方向时,当前的应用程序活动就会被破坏并重新创建。因此,为了解决该问题(即取回所有数据),我这样做:

  1. 声明一些变量
private const val STATE_OPERAND1 = "data"
private const val STATE_PENDING_OPERATION = "PENDING_OPERATION"
private const val STATE_OPERAND1_STORED = "data"
  1. 覆盖“ onSaveInstanceState”功能
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)
}
  1. 覆盖“ onRestoreInstanceState”功能
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"

结果 文本框显示了应该输入的文本,并且一切正常。只要第一个代码中的所有三个声明都不同,该应用程序就可以工作。为什么会这样呢?

1 个答案:

答案 0 :(得分:3)

带有初始声明:

private const val STATE_OPERAND1 = "data"
private const val STATE_OPERAND1_STORED = "data"

此行:

outState.putDouble(STATE_OPERAND1, operand1!!)

通过键BundleDouble对象内部设置operand1!!"data"
下一行:

outState.putBoolean(STATE_OPERAND1_STORED, true)

通过键BundleBoolean对象内再次设置(覆盖)true"data"
结果是先前的Double值现在丢失,并且唯一存在的值为新的Boolean值。
因此,您只有一个Boolean值。
当您更改为:

private const val STATE_OPERAND1 = "STATE_OPERAND1"
private const val STATE_OPERAND1_STORED = "data"

此冲突消失了,因为您有2个不同的键,并且正确保存了这2个值,而不会彼此覆盖。