Не бывает слишком много клавиатур

Или как скрывать клавиатуру не только нажатием на “назад”

sashatinkoff
О разработке для Android
2 min readMar 3, 2020

--

Несмотря на то, что документация вполне себе четко говорит о том, что клавиатура показывается или скрывается, когда поле ввода получает фокус или теряет, кажется это работает только в одну сторону.

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 какой-нибудь, но в рамках поставленной (мне) задачи форму необходимо было скрыть при нажатии хоть куда.

Итак, что для достижения желанного результата нам необходимо:

  1. Возможность скрывать клавиатуру программно
  2. Перехватывать нажатие на любую вьюшку, кроме EditText
  3. Какая-нибудь фишечка, которая еще и будет выглядеть красиво (я говорю про extensions — расширения функционала классов в Kotlin).

Итак, поехали.

Как скрыть клавиатуру?

Со скрытием клавиатуры (почти) все просто за одним маленьким исключением — для фрагментов и активити эта процедура немного отличается. Смотрим код

Разница заключается в получении рута нашей вьюшки — для активити это android.R.id.content, а для фрагмента просто view (на самом деле в канонической Java это метод getView

Просто хотел бы уточнить на случай если вдруг вы явно указали val view = someView и у вас вдруг не заработало. А в остальном — вполне себе вменямый и рабочий код

Как найти все вьюшки которые содержатся в нашем контейнере?

Сразу перейдем к коду:

В этом расширении мы рекурсивно проходим по всем потомкам нашей вьюшки. Если мы хотим отфильтровать по тегу (или еще какому-нибудь параметру, но у меня — по тегу) вьюшки, то явно его указываем. И далее просто пихаем в callback что именно мы хотим сделать с каждой вьюшкой (например, окрасить все цвета в красный, хехе)

По идее можно уже так и оставить, и в случае использования кода в любом фрагменте просто писать

Но кусок кода в callback не получится написать меньше чем в одну простую и в будущем не модифицированную строку, поэтому пойдем чуть дальше. Напишем еще одно расширение к вьюшке (последнее), которое уже будет заключительным и вставляться в Activity / Fragment в момент создания.

Вот и все готово. В любом фрагменте с формочкой в методе onCreateView / onViewCreated (в зависимости от ваших пожеланий и конкретных реализаций) пишем код

и наслаждаемся результатом

P.S. Написание поста заняло раз в 10–15 больше времени, чем написание этого кода =)

--

--

sashatinkoff
О разработке для Android

Пишу о разном с матом ем булку с маком никогда не бегал с автоматом