afterTextChange всегда получает один и тот же редактируемый экземпляр - PullRequest
1 голос
/ 26 сентября 2019

Я столкнулся с проблемой пользовательского TextWatcher в Android 10.

Проблема заключалась в том, что наш пользовательский TextWatcher сохранял ссылку на Editable, переданную в качестве параметра afterTextChanged.

Эта ссылка сравнивалась с новой Editable каждый раз, когда вызывается afterTextChanged.

Очевидно, что в Android 10 экземпляр Editable всегда одинаков для всех afterTextChangedinvocations.

Это было не так до 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) {
    ...
  }
}

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

  • Была ли первоначальная реализация ошибочной, и мы никогда не должны были предполагать, что экземпляр всегда будет другим?

  • Ожидаемое и правильное ли новое поведение?или это какая-то регрессия?

  • Есть ли место, где я могу найти документацию по этому поводу?Такого рода изменения структуры сложно обнаружить, и хотелось бы быть на их вершине.

Спасибо

...