Не бывает слишком много клавиатур
Или как скрывать клавиатуру не только нажатием на “назад”
Несмотря на то, что документация вполне себе четко говорит о том, что клавиатура показывается или скрывается, когда поле ввода получает фокус или теряет, кажется это работает только в одну сторону.
When input focus moves into or out of an editable text field, Android shows or hides the input method (such as the on-screen keyboard) as appropriate
https://developer.android.com/training/keyboard-input/visibility
А именно — когда фокус есть в поле, клавиатура выскакивает, а там ты хоть на родительский контейнер наобжимайся, она никуда не исчезнет. Если конечно на кнопочку нажать, submit какой-нибудь, но в рамках поставленной (мне) задачи форму необходимо было скрыть при нажатии хоть куда.
Итак, что для достижения желанного результата нам необходимо:
- Возможность скрывать клавиатуру программно
- Перехватывать нажатие на любую вьюшку, кроме EditText
- Какая-нибудь фишечка, которая еще и будет выглядеть красиво (я говорю про extensions — расширения функционала классов в Kotlin).
Итак, поехали.
Как скрыть клавиатуру?
Со скрытием клавиатуры (почти) все просто за одним маленьким исключением — для фрагментов и активити эта процедура немного отличается. Смотрим код
Разница заключается в получении рута нашей вьюшки — для активити это android.R.id.content, а для фрагмента просто view (на самом деле в канонической Java это метод getView
Просто хотел бы уточнить на случай если вдруг вы явно указали val view = someView и у вас вдруг не заработало. А в остальном — вполне себе вменямый и рабочий код
Как найти все вьюшки которые содержатся в нашем контейнере?
Сразу перейдем к коду:
В этом расширении мы рекурсивно проходим по всем потомкам нашей вьюшки. Если мы хотим отфильтровать по тегу (или еще какому-нибудь параметру, но у меня — по тегу) вьюшки, то явно его указываем. И далее просто пихаем в callback что именно мы хотим сделать с каждой вьюшкой (например, окрасить все цвета в красный, хехе)
По идее можно уже так и оставить, и в случае использования кода в любом фрагменте просто писать
view.applyOnChildren { ... }
Но кусок кода в callback не получится написать меньше чем в одну простую и в будущем не модифицированную строку, поэтому пойдем чуть дальше. Напишем еще одно расширение к вьюшке (последнее), которое уже будет заключительным и вставляться в Activity / Fragment в момент создания.
Вот и все готово. В любом фрагменте с формочкой в методе onCreateView / onViewCreated (в зависимости от ваших пожеланий и конкретных реализаций) пишем код
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
createToolbar()
createViewFlipper()
view.hideKeyboardOnTouch(this)
и наслаждаемся результатом
P.S. Написание поста заняло раз в 10–15 больше времени, чем написание этого кода =)