Ваша главная проблема в том, что вы следите за переменной.Вы объявили var finalValue
дважды - около вершины onCreate
и внутри обратного вызова.Внутри обратного вызова вы обновляете временную переменную, которая существует только в этой области.Внешняя переменная никогда не обновляется.
У вас нет переменной на уровне класса.Самая внешняя версия определяется только в пределах onCreate
.
class MainActivity : AppCompatActivity() {
// this is not a good variable name, since the variable is not final
// in the programming sense or in any other sense of the word
var finalValue = 30
override fun onCreate(savedInstanceState: Bundle?) {
// ...
edittext.setOnEditorActionListener { v, actionId, event ->
// ...
var value: String = edittext.getText().toString()
// note that I'm not re-declaring with "var" here
finalvalue = Integer.parseInt(value)
// ...
}
// ...
}
}
Если бы я мог дать другой совет:
- Правильно отформатируйте код.Используйте функцию автоматического форматирования Android Studio.То, что у вас здесь есть, похоже на стиль C, но это Котлин, так что ...
- Разбейте свой код.Причина, по которой вы столкнулись с проблемами, заключается в том, что у вас есть только одна гигантская функция, которая делает все.Ваши обратные вызовы должны просто вызывать функцию, где эта функция выполняет всю логику.Примерно так:
fun onCreate(savedInstanceState: Bundle?) {
editText.setOnEditorActionListener { v, actionId, event ->
onEditTextChanged(editText.getText())
}
}
fun onEditTextChanged(text : String) {
// all of the logic from the callback goes here
}
Когда ваш код менее перемешан, легче понять, что такое логика.
Часто найти ошибку в грязном коде - это как найти что-тов грязной комнате.Если вы хотите что-то найти, начните собирать.Тогда вы выполняете две вещи одновременно.Когда вы будете чистить, вы найдете то, что ищете - и у вас будет хорошая чистая комната!