Что не так с моим файлом MainActivity.kt? - PullRequest
0 голосов
/ 28 мая 2019

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

  1. Объявление некоторых переменных
private const val STATE_OPERAND1 = "data"
private const val STATE_PENDING_OPERATION = "PENDING_OPERATION"
private const val STATE_OPERAND1_STORED = "data"
Переопределение функции «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)
}
Переопределение функции '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' в третьем коде не требуется, поэтому я добавил, что обнаружил ошибку.В этом коде тестовое поле result очищает предыдущий текст и содержит введенный текст 'null'.

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

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

1 Ответ

3 голосов
/ 28 мая 2019

С первоначальными декларациями:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...