Что не так с моим файлом MainActivity.kt?

Я создаю приложение калькулятора. Всякий раз, когда пользователь меняет ориентацию устройства, текущая активность приложения уничтожается и создается заново. Итак, чтобы решить эту проблему (т.е. вернуть все данные), я сделал следующее:

  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
    }

«Отмеченная строка 1» в 3-м коде не требуется, причина, по которой я добавил, - выяснить ошибку. В этом коде тестовое поле результат очищает предыдущий текст и вводит текст «null».

Однако, когда я изменил объявление в 1 от private const val STATE_OPERAND1 = "data" до private const val STATE_OPERAND1 = "STATE_OPERAND1"

Текстовое поле результат показывало текст, который должен был быть, и все работало правильно. Приложение работало до тех пор, пока все три объявления в 1-м коде были разными. Почему это так?

0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 значения были правильно сохранены без перезаписи друг друга.

Ох... это имеет смысл... Большое спасибо. Я новичок во многом из этого.

Sujit 28.05.2019 19:11

Другие вопросы по теме