Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Убрать клавиатуру при щелчке на свободное место

#android #клавиатура


Как убрать клавиатуру при щелчке на другое место экрана?    


Ответы

Ответ 1



Мне кажется это какой-то нездоровый паттерн действий юзера. В Андроид предусмотрен способ скрытия клавиатуры нажатием кнопки "Back" или же в некоторых софт-клавиатурах предусмотрена кнопка скрытия клавиатуры. Кроме того нельзя упускать из виду, что есть девайсы с хардверными клавиатурами. Так что я бы не стал заморачиваться таким велосипедостроительством. Если это ваша личная инициатива - забудьте о ней, если хотелки заказчика, то попробуйте объяснить ему что в экосистеме Андроида так не принято делать - покажите ему альтернативы. Если заказчик все равно хочет - установите ему клавиатуру с кнопкой скрытия. Если все равно продолжает настаивать то тогда изобретайте велосипед примерно таким макаром: Определите что такое "другое место экрана" В этом "другом месте экрана" повесьте листенер клика - View.OnClickListener По событию клика убирайте фокус EditText.clearFocus() или просто скрывайте клаву через getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) Проблема здесь в том, что этих "других мест экрана" может быть слишком много и при изменении дизайна придется опять на них вешать слушатели. Альтернативное решение такое: Надо обрабатывать Activity.onTouchEvent() - он вызывается всякий раз когда касание не было перехвачено никаким виджетом/вьюшкой. Далее применяем п. 3. Минус этого решения в том, что скрытие клавы будет происходить только при касании пустого места в Activity - то есть опять упирается в определение понятия "другого места экрана"

Ответ 2



Для скрытия клавиатуры по нажатию на любое место на экране, кроме текстовых полей нужно переопределить метод @Override public boolean dispatchTouchEvent(@NonNull MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (v instanceof EditText) { v.clearFocus(); InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return super.dispatchTouchEvent(event); }

Комментариев нет:

Отправить комментарий