Как это может произойти?
Скорее всего, когда это происходит, ваше приложение выходит на передний план, когда пользователь печатает (например, из-за входящего вызова).
Если Fragment
уничтожено, TextWatcher
не должно вызываться, верно?
Верно.Но вы упускаете порядок, в котором Fragment
и Layout
надуваются "внутри", это уничтожается.Разрушение для этих двух не выполняется одновременно - Layout
уничтожается первым.
Как видите, TextWatcher
является анонимным экземпляром внутреннего класса, который сохраняет ссылку на свой внешний класс , ваш Fragment
, который должен быть уничтожен последним.Ключевым моментом здесь является то, что любые изменения текста в EditText
, поступающие из TextWatcher
, выполняются асинхронно - представление процесса вашего приложения получает «уведомления» от другого процесса в системе, приложение с программной клавиатурой ( значение по умолчанию * 1025)*).
В случае, когда такое «уведомление» приходит одновременно, ваш EditText
был уничтожен, а ваш Fragment
нет, вы получаете NPE .
Как это можно предотвратить?
Просто используйте phone_number_input?.error = ...