После срабатывания функции программа "вылетает" (лог ошибки привожу)
Лог ошибки и функции, на которые ссылается код (в спойлер не сумел поместить): "Вылетает" если дата не корректна, потому что срабатывает код:
i.setOnFocusChangeListener { viewCurrentNext: View, hasFocus ->
currentFieldNext = viewCurrentNext as EditText
if(hasFocus) //проверяется получение фокуса
currentFieldNext.clearFocus()
}
Но он нужен, чтобы очищать фокус иначе на экране множественные курсоры и в текущем тапнутом поле (в которое вышли), и в том, в которое нужно вернуться (с ошибкой). В эмуляторе во всяком случае так
2021-08-31 16:46:52.759 5686-5686/ru.jurvrn.sid E/InputEventReceiver: Exception dispatching
input event.
2021-08-31 16:46:52.759 5686-5686/ru.jurvrn.sid E/MessageQueue-JNI: Exception in MessageQueue
callback: handleReceiveCallback
2021-08-31 16:46:52.806 5686-5686/ru.jurvrn.sid E/MessageQueue-JNI:
kotlin.UninitializedPropertyAccessException: lateinit property i has not been initialized
at ru.jurvrn.sid.FirstFragment.getI(FirstFragment.kt:42)
at ru.jurvrn.sid.MyFunctionsKt.lineChangeOnError(MyFunctions.kt:162)
at ru.jurvrn.sid.MyFunctionsKt.correctDate(MyFunctions.kt:138)
at ru.jurvrn.sid.FirstFragment.onViewCreated$lambda-2$lambda-1(FirstFragment.kt:91)
at ru.jurvrn.sid.FirstFragment.$r8$lambda$qVDIpVYn2xBOG7s8tvHHoUk_z00(Unknown Source:0)
at ru.jurvrn.sid.FirstFragment$$ExternalSyntheticLambda4.onFocusChange(Unknown Source:2)
at android.view.View.onFocusChanged(View.java:7265)
at android.widget.TextView.onFocusChanged(TextView.java:10005)
at android.view.View.clearFocusInternal(View.java:7101)
at android.view.View.unFocus(View.java:7134)
at android.view.ViewGroup.requestChildFocus(ViewGroup.java:813)
at android.view.View.handleFocusGainInternal(View.java:6926)
at android.view.View.requestFocusNoSearch(View.java:11546)
at android.view.View.requestFocus(View.java:11520)
at android.view.View.requestFocus(View.java:11487)
at android.view.View.requestFocus(View.java:11429)
at android.view.View.onTouchEvent(View.java:13764)
at android.widget.TextView.onTouchEvent(TextView.java:10064)
at android.view.View.dispatchTouchEvent(View.java:12513)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)
at android.app.Activity.dispatchTouchEvent(Activity.java:3400)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398)
at android.view.View.dispatchPointerEvent(View.java:12752)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.Vie
2021-08-31 16:46:52.815 5686-5686/ru.jurvrn.sid E/AndroidRuntime: FATAL EXCEPTION: main
Process: ru.jurvrn.sid, PID: 5686
kotlin.UninitializedPropertyAccessException: lateinit property i has not been initialized
at ru.jurvrn.sid.FirstFragment.getI(FirstFragment.kt:42)
at ru.jurvrn.sid.MyFunctionsKt.lineChangeOnError(MyFunctions.kt:162)
at ru.jurvrn.sid.MyFunctionsKt.correctDate(MyFunctions.kt:138)
at ru.jurvrn.sid.FirstFragment.onViewCreated$lambda-2$lambda-1(FirstFragment.kt:91)
at ru.jurvrn.sid.FirstFragment.$r8$lambda$qVDIpVYn2xBOG7s8tvHHoUk_z00(Unknown Source:0)
at ru.jurvrn.sid.FirstFragment$$ExternalSyntheticLambda4.onFocusChange(Unknown Source:2)
at android.view.View.onFocusChanged(View.java:7265)
at android.widget.TextView.onFocusChanged(TextView.java:10005)
at android.view.View.clearFocusInternal(View.java:7101)
at android.view.View.unFocus(View.java:7134)
at android.view.ViewGroup.requestChildFocus(ViewGroup.java:813)
at android.view.View.handleFocusGainInternal(View.java:6926)
at android.view.View.requestFocusNoSearch(View.java:11546)
at android.view.View.requestFocus(View.java:11520)
at android.view.View.requestFocus(View.java:11487)
at android.view.View.requestFocus(View.java:11429)
at android.view.View.onTouchEvent(View.java:13764)
at android.widget.TextView.onTouchEvent(TextView.java:10064)
at android.view.View.dispatchTouchEvent(View.java:12513)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)
at android.app.Activity.dispatchTouchEvent(Activity.java:3400)
Функции:
listOfDates = listOf(date1, date2, date3, date4)
listOfDates.forEach {
i -> i.setOnFocusChangeListener { viewCurrent: View, hasFocus ->
currentField = viewCurrent as EditText
currentField.addTextChangedListener(object : TextWatcher {
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun afterTextChanged(s: Editable) {
when (currentField.text.length) {
2 -> currentField.append(".")
5 -> currentField.append(".")
}
}
})
if(!hasFocus)
correctDate()
}
}
@RequiresApi(Build.VERSION_CODES.O)
fun FirstFragment.correctDate() {
if (currentField.text.toString().isNotEmpty()) {
@RequiresApi(Build.VERSION_CODES.O)
fun parseLocalDateOrNull(text: String, formatter: DateTimeFormatter) = try {
LocalDate.parse(text, formatter)
} catch (ex: DateTimeParseException) {
null
}
val dateFormatInput = DateTimeFormatter.ofPattern("dd.MM.uuuu").withResolverStyle(ResolverStyle.STRICT)
val dateCorrect = parseLocalDateOrNull(currentField.text.toString(), dateFormatInput)
if (dateCorrect == null) {
Toast.makeText(requireActivity(), "Некорректная дата! ", Toast.LENGTH_SHORT).show()
lineChangeOnError()
} else {
lineChangeOnTrue()
}
}
else
{
currentField.setBackgroundResource(R.drawable.line_bottom_white_back)
}
}
fun FirstFragment.lineChangeOnTrue(){
val layerDrawable = ContextCompat.getDrawable(requireActivity(), R.drawable.line_bottom_white_back) as LayerDrawable
val gradientDrawable = layerDrawable.findDrawableByLayerId(R.id.line_bottom_white_back_id) as GradientDrawable
gradientDrawable.setColor(Color.parseColor("#ecfff1"))
currentField.background = layerDrawable
}
fun FirstFragment.lineChangeOnError(){
val layerDrawable = ContextCompat.getDrawable(requireActivity(), R.drawable.line_bottom_white_back) as LayerDrawable
val gradientDrawable = layerDrawable.findDrawableByLayerId(R.id.line_bottom_white_back_id) as GradientDrawable
gradientDrawable.setColor(Color.parseColor("#ffebeb"))
currentField.background = layerDrawable
i.setOnFocusChangeListener { viewCurrentNext: View, hasFocus ->
currentFieldNext = viewCurrentNext as EditText
if(hasFocus) //проверяется получение фокуса
currentFieldNext.clearFocus()
}
currentField.requestFocus()
}