Есть несколько моментов, которые необходимо прояснить, прежде чем я смогу ответить на вопрос. Давайте сделаем это шаг за шагом:
Если EditText получает фокус, слушатель получает уведомление.
focusListener слушает как получение фокуса, так и его потерю.
editText.setOnFocusChangeListener { view, hasFocus ->
if (hasFocus) toast("focus gained") else toast("focus lost")
}
Используя hasFocus boolean, вы можете решить, что делать с каждым случаем.
слушатель снова получает уведомление после поворота экрана
Получено ли уведомление о получении или потере фокуса?
при восстановлении фокуса на новом фрагменте
Получает ли EditText фокус или теряет фокус после поворота экрана?
Есть ли полезная практика, чтобы различать guish между уведомлением слушателя из-за изменения конфигурации и из-за реального взаимодействия с человеком?
Вы можете попробовать использовать это официальное руководство для сохранения состояния и это для изменения конфигурации . Вы можете сохранить некоторое логическое значение runCodeInListener = false в Bundle. Получить это логическое значение при воссоздании фрагмента или активности. После этого измените код внутри слушателя:
editText.setOnFocusChangeListener {view, hasFocus ->
if (runCodeInListener) {
if (hasFocus) toast("focus gained") else toast("focus lost")
} else {
runCodeInListener = true
}
}
После восстановления слушатель не будет запускать код при первом изменении фокуса EditText,
Или ли вообще запретить уведомление слушателя после изменения фокуса из-за изменения конфигурации?
Слушатель вызывается только при изменении фокуса EditText. Если мы предотвратим вышеупомянутое изменение, слушатель не будет уведомлен. Вы предполагаете, что это изменение происходит из-за изменения конфигурации: изменение фокуса из-за изменения конфигурации? Однако есть еще один момент, который необходимо уточнить. Когда этот фрагмент создается впервые, имеет ли EditText фокус? Если это так, то это первый фокусируемый вид в макете, и после изменения конфигурации он снова получает фокус .
Создайте еще один EditText в макете, установите на него нового слушателя и посмотрите если этот также вызывается после поворота экрана. Если мой ответ правильный, слушатель второго EditText не должен получать уведомления, поскольку только первый фокусируемый EditText должен иметь фокус. Чтобы предотвратить фокусировку EditText, вы также можете использовать this или this
Это требует некоторого редактирования, поэтому, если что-то не ясно, пожалуйста, спросите.