Ошибка инициализации переменной (current View) потому что она "null"
Текущего поля может не быть (то есть в поле может и не быть фокуса) - программа вылетает с ошибкой на строке currentField.clearFocus()
Лог ошибки:
2021-09-10 20:03:52.893 10285-10285/ru.jurvrn.sid E/AndroidRuntime: FATAL EXCEPTION: main
Process: ru.jurvrn.sid, PID: 10285
kotlin.UninitializedPropertyAccessException: lateinit property currentField has not been initialized
at ru.jurvrn.sid.FirstFragment.getCurrentField(FirstFragment.kt:45)
at ru.jurvrn.sid.FirstFragment.onViewCreated$lambda-4(FirstFragment.kt:90)
at ru.jurvrn.sid.FirstFragment.$r8$lambda$a6bb2rdRI450WvNRJFUdj-EKBzo(Unknown Source:0)
at ru.jurvrn.sid.FirstFragment$$ExternalSyntheticLambda1.onClick(Unknown Source:2)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
Часть кода:
public lateinit var currentField: EditText
i -> i.setOnFocusChangeListener { viewCurrent : View, hasFocus ->
currentField = viewCurrent as EditText
if(!hasFocus)
correctDateInput()
currentField?.clearFocus()
Подстановка ? не помогает currentField?.clearFocus()
Ответы (2 шт):
Все же в ошибке написано.
lateinit property currentField has not been initialized
Если вы что-то обозначили как lateinit (поздняя инициализация), то будьте добры не обращаться за значением, пока вы сами туда значение хоть раз не запишите. У lateinit переменных нет значений по умолчанию.
В вашем конкретном случае пока не сработал хоть раз setOnFocusChangeListener, обращаться к currentField нельзя.
Здесь подробнее: https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables
с помощью Eugene Krivenja и ЮрийСПб понял что переменная не просто null, а её вообще как-бы нет, вот что значит не инициализированна. Решение - проверить инициализацию. Есть два варианта, пока не проверил на практике.
if (this::currentField.isInitialized) { currentField.clearFocus() }
или 2 вариант - проверять из функции:
if (setOnFocusChangeListener::currentField.isInitialized) {
currentField.clearFocus()
}
и 3 вариант - для проверки
var currentField: EditText? = null
currentField?.clearFocus()