Я создаю приложение калькулятора. Всякий раз, когда пользователь меняет ориентацию устройства, текущая активность приложения уничтожается и создается заново. Итак, чтобы решить эту проблему (т.е. вернуть все данные), я сделал следующее:
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
}
«Отмеченная строка 1» в 3-м коде не требуется, причина, по которой я добавил, - выяснить ошибку. В этом коде тестовое поле результат очищает предыдущий текст и вводит текст «null».
Однако, когда я изменил объявление в 1
от private const val STATE_OPERAND1 = "data" до private const val STATE_OPERAND1 = "STATE_OPERAND1"
Текстовое поле результат показывало текст, который должен был быть, и все работало правильно. Приложение работало до тех пор, пока все три объявления в 1-м коде были разными. Почему это так?
С начальными объявлениями:
private const val STATE_OPERAND1 = "data"
private const val STATE_OPERAND1_STORED = "data"
эта строка:
outState.putDouble(STATE_OPERAND1, operand1!!)
устанавливает внутри объекта Bundle значение Doubleoperand1!! по ключу "data".
Следующая строка:
outState.putBoolean(STATE_OPERAND1_STORED, true)
заново устанавливает (перезаписывает) внутри объекта Bundle значение Booleantrue по ключу "data".
В результате предыдущее значение Double теперь равно потерянный, и единственное существующее значение — это новое значение Boolean.
Итак, у вас есть только одно Boolean значение.
Когда вы изменили на:
private const val STATE_OPERAND1 = "STATE_OPERAND1"
private const val STATE_OPERAND1_STORED = "data"
этот конфликт исчез, потому что у вас было 2 разных ключа, и 2 значения были правильно сохранены без перезаписи друг друга.
Ох... это имеет смысл... Большое спасибо. Я новичок во многом из этого.