Я столкнулся с проблемой пользовательского TextWatcher
в Android 10.
Проблема заключалась в том, что наш пользовательский TextWatcher
сохранял ссылку на Editable
, переданную в качестве параметра afterTextChanged
.
Эта ссылка сравнивалась с новой Editable
каждый раз, когда вызывается afterTextChanged
.
Очевидно, что в Android 10 экземпляр Editable
всегда одинаков для всех afterTextChanged
invocations.
Это было не так до Android 10, отсюда проблема и этот вопрос.
Ниже приведено упрощение реализации
class MyTextWatcher : TextWatcher {
private var oldEditable: Editable? = null
override fun afterTextChanged(newEditable: Editable) {
// if this is Android 10, then the following is always true
// (except when oldEditable == null)
// If android < 10, this is always false, as there's
// always a different instance of Editable being passed.
if (oldEditable == newEditable) {
}else{
oldEditable = newEditable // Hold to the new instance
}
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
...
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
...
}
}
Я понимаюпредыдущая реализация могла бы быть не идеальной, поэтому я думаю, что вопросы таковы:
Была ли первоначальная реализация ошибочной, и мы никогда не должны были предполагать, что экземпляр всегда будет другим?
Ожидаемое и правильное ли новое поведение?или это какая-то регрессия?
Есть ли место, где я могу найти документацию по этому поводу?Такого рода изменения структуры сложно обнаружить, и хотелось бы быть на их вершине.
Спасибо