Скрыть клавиатуру Android Studio

Обновлено: 14.08.2022

После записи в поле редактирования и нажатия кнопки я хочу скрыть виртуальную клавиатуру при касании вне клавиатуры. Я предполагаю, что это простой фрагмент кода, но где я могу найти его пример?

Что делать, если у вас есть только один EditText и несколько кнопок, таких как флажки и переключатели? Единственное место, где вам нужна клавиатура, находится в единственном EditText. Как вы регистрируетесь, чтобы знать, что было выбрано/нажато что-то еще, чтобы скрыть клавиатуру?

Я чувствую себя глупо. Я не могу скрыть клавиатуру в ICS. Перепробовал здесь все методы и их комбинации. Ни за что. Метод показать это работает, но я не могу скрыть его независимо от того, какой токен окна, скрыть флаги, настройки манифеста или свечи каким-либо святым. При отображении клавиатуры я всегда вижу это: I/LatinIME(396): указан InputType.TYPE_NULL W/LatinIME(396): непредвиденный класс ввода: inputType=0x00000000 imeOptions=0x00000000

По мере увеличения размера и разрешения экрана устройств скрытие виртуальной клавиатуры становится менее важным.

123 Ответы 123

Вы можете заставить Android скрыть виртуальную клавиатуру с помощью InputMethodManager, вызова hideSoftInputFromWindow и передачи маркера окна, содержащего ваш сфокусированный вид.

Это заставит клавиатуру быть скрытой во всех ситуациях. В некоторых случаях вы захотите передать InputMethodManager.HIDE_IMPLICIT_ONLY в качестве второго параметра, чтобы убедиться, что вы скрываете клавиатуру только тогда, когда пользователь явно не заставлял ее появляться (удерживая меню).

Примечание. Если вы хотите сделать это в Kotlin, используйте: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

Синтаксис Котлина

теперь для getSystemService() требуется Context и класс serviceClass . Для контекста я могу вызвать requiredContext, но как насчет класса обслуживания?

@capo11 Я пробовал с Application.Context.getSystemService(), поэтому мне не нужен класс обслуживания, но он не работает

Чтобы прояснить это безумие, я хотел бы начать с извинений от имени всех пользователей Android за совершенно нелепое обращение Google с программной клавиатурой. Причина, по которой существует так много разных ответов на один и тот же простой вопрос, заключается в том, что этот API, как и многие другие в Android, ужасно спроектирован. Я не могу придумать вежливого способа выразить это.

Я хочу скрыть клавиатуру. Я ожидаю предоставить Android следующий оператор: Keyboard.hide() . Конец. Спасибо большое. Но у Андроида есть проблема. Вы должны использовать InputMethodManager, чтобы скрыть клавиатуру. Хорошо, хорошо, это API Android для клавиатуры. НО! У вас должен быть контекст, чтобы получить доступ к IMM. Теперь у нас есть проблема. Я могу захотеть скрыть клавиатуру от статического или служебного класса, который не использует или не нуждается в каком-либо Context . или И НАМНОГО хуже, IMM требует, чтобы вы указали, от какого вида (или, что еще хуже, от какого окна) вы хотите скрыть клавиатуру.

Вот почему скрыть клавиатуру так сложно. Уважаемый Google: когда я ищу рецепт торта, на Земле нет ни одного поставщика рецептов, который отказался бы предоставить мне рецепт, если я сначала не отвечу, КЕМ будет съеден торт И где он будет съеден !!< /p>

Эта грустная история заканчивается неприглядной правдой: чтобы скрыть клавиатуру Android, вам потребуется предоставить 2 формы идентификации: Контекст и либо Представление, либо Окно .

Я создал статический служебный метод, который может ОЧЕНЬ хорошо выполнять свою работу, если вы вызываете его из Activity .

Имейте в виду, что этот служебный метод работает ТОЛЬКО при вызове из действия! Приведенный выше метод вызывает getCurrentFocus целевого действия, чтобы получить правильный токен окна.

Но предположим, вы хотите скрыть клавиатуру от EditText, размещенного в DialogFragment? Вы не можете использовать описанный выше метод для этого:

Это не сработает, потому что вы будете передавать ссылку на активность хоста фрагмента, которая не будет иметь сфокусированного управления, пока фрагмент отображается! Ух ты! Итак, чтобы скрыть клавиатуру от фрагментов, я прибегаю к более низкоуровневому, более распространенному и уродливому:

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

О окнеSoftInputMode

Есть еще один спорный момент, о котором следует помнить. По умолчанию Android автоматически назначит начальный фокус первому EditText или фокусируемому элементу управления в вашей Activity. Отсюда естественно следует, что InputMethod (как правило, программная клавиатура) будет реагировать на событие фокуса, показывая себя. Если атрибут windowSoftInputMode в AndroidManifest.xml имеет значение stateAlwaysHidden , он указывает клавиатуре игнорировать этот автоматически назначенный начальный фокус.

Невероятно, но ничего не делает, чтобы предотвратить открытие клавиатуры при касании элемента управления (если элементу управления не назначен focusable="false" и/или focusableInTouchMode="false").По-видимому, параметр windowSoftInputMode применяется только к событиям автоматической фокусировки, а не к событиям фокусировки, вызванным событиями касания.

Поэтому stateAlwaysHidden действительно ОЧЕНЬ неудачно назван. Возможно, вместо этого его следует называть ignoreInitialFocus.

ОБНОВЛЕНИЕ: больше способов получить токен окна

Если сфокусированного представления нет (например, это может произойти, если вы только что изменили фрагменты), есть другие представления, которые предоставят полезный маркер окна.

Это альтернативы приведенному выше коду if (view == null) view = new View(activity); Они не относятся явно к вашей деятельности.

Внутри класса фрагмента:

Данный фрагмент фрагмента в качестве параметра:

Начиная с основного содержания:

ОБНОВЛЕНИЕ 2. Снимите фокус, чтобы клавиатура не отображалась снова, если вы открываете приложение в фоновом режиме

Во многих случаях нам нужно скрыть виртуальную клавиатуру (также называемую виртуальной клавиатурой), когда, вероятно, происходит изменение фокуса, нажатие кнопки (например, «Отправить») или любое другое действие. Может быть случай, когда вы не хотите, чтобы клавиатура открывалась, когда пользователь вводит действие.

Вы можете использовать любой из множества сниппетов, представленных в Интернете, но после того, как вы нажмете сборку, вы заметите, что он должен был вызываться из Activity или, возможно, требовал передачи представления. Следовательно, не существует универсального решения для такого простого требования.

Android предоставляет класс InputMethodManager, который работает с текущим методом ввода для приложения.

article

Было бы проще напрямую вызвать метод из InputMethodManager, чтобы скрыть или закрыть отображаемую в данный момент клавиатуру, но здесь возникает проблема.

Для получения экземпляра InputMethodManager требуется контекст. Получить контекст не проблема, но такие методы обычно вызываются из каких-то служебных классов, не имеющих контекста.

Если получить правильный экземпляр контекста было недостаточно, InputMethodManager также требует представления, от которого нужно скрыть клавиатуру. Здесь как начинающие, так и опытные компании по разработке приложений для Android чувствуют себя обманутыми.

Вот служебный метод, который закрывает виртуальную клавиатуру, НО только когда вы вызываете ее из действия:

Пример вызова closeKeyboard, где MainActivity — ваша текущая активность:

Для этого метода требуется текущий экземпляр Activity, в котором вы пытаетесь скрыть виртуальную клавиатуру.

Ограничение этого служебного метода заключается в том, что его необходимо вызывать из действия. Это не сработает при вызове из фрагмента. Вам может показаться, что родительская активность фрагмента вызывает его с помощью getActivity(), но это не сработает, потому что пока фрагмент отображается, родительская активность не удерживает никакого фокуса.

Чтобы скрыть виртуальную клавиатуру из фрагмента, вы можете использовать следующий служебный метод:

public static void hideKeyboardFrom(Context context, View view)

Это можно вызвать, передав контекст и представление текущего отображаемого экрана, где вы хотите скрыть клавиатуру:

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

Обратите внимание, что мы изменили способ получения «Просмотра».

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

Всякий раз, когда действие запускается с фокусируемым представлением, SoftKeyboard должна запускаться, как только будет найдено первое фокусируемое представление, поскольку начальный фокус назначается этому представлению. Если вы хотите скрыть клавиатуру при запуске Activity, вам потребуется обновить атрибут «windowSoftInputMode» в AndroidManifest.xml.

Это ограничивает автоматический запуск клавиатуры при запуске действия, но не останавливает всплывающую клавиатуру при касании фокусируемого представления.

Наоборот, если ситуация требует отображения SoftKeyboard при запуске действия без необходимости касания пользователем фокусируемого или редактируемого представления, вы можете соответствующим образом изменить атрибут «windowSoftInputMode»:

Это несколько случаев, связанных с распространенными сценариями работы с клавиатурой. Хорошей практикой является точное управление клавиатурой в соответствии с вариантом использования, а не решение Android, поскольку пользователю может быть очень неприятно вручную закрывать клавиатуру, когда это не требуется. Это может привести к случайному закрытию текущего действия или фрагмента из-за нажатия кнопки «Назад». Это препятствует выполнению текущей операции. К сожалению, это может привести к полной потере интереса пользователя к вашему приложению.

Обсудите с нашими экспертами требования к мобильному приложению

Свяжитесь с нами и узнайте больше о том, как наши специалисты могут помочь развитию вашего бизнеса.

Скрыть виртуальную клавиатуру в приложении Android очень просто: просто нажмите кнопку "Назад" на телефоне Android. Но в некоторых ситуациях это не работает, как полноэкранное действие.

Скрыть код Android программной клавиатуры в Kotlin

Итак, как скрыть программную клавиатуру Android?

Предположим, у нас есть EditText и Button в моем макете. После щелчка и записи в поле редактирования, а затем нажатия кнопки мы хотим скрыть виртуальную клавиатуру.

Вы можете использовать Android со следующим оператором: Keyboard.hide() . Что это, но у Android есть проблема. Вы должны использовать InputMethodManager, чтобы скрыть клавиатуру.

Это Android API для клавиатуры. НО! У вас должен быть контекст, чтобы получить доступ к IMM. Теперь у нас есть проблема. Я могу захотеть скрыть клавиатуру от статического или служебного класса, который не использует или не нуждается в каком-либо Context . или И НАМНОГО хуже, IMM требует, чтобы вы указали, от какого вида (или, что еще хуже, от какого окна) вы хотите скрыть клавиатуру.

Вот почему скрыть клавиатуру так сложно. Давайте закроем/скроем приложение Android Soft Keyboard для Android.

Основной код в kotlin:-

Давайте посмотрим пошаговое кодирование:-

Шаг 1. Создайте новый проект «Создайте свое первое приложение для Android на Kotlin»

Шаг 2. Откройте «MainActivity.kt» и добавьте следующий код.

Шаг 3. Добавьте EditText и Button в макет ресурсов «activity_main.xml»

Шаг 4. Теперь запустите приложение в эмуляторе или на устройстве Android.

Вывод снимка экрана Android Keyboard, пример скрытия приложения:

Скачать исходный код Hide Soft keyboard android code in Kotlin

Примечание. Снимите фокус, чтобы клавиатура не отображалась снова, если вы открываете приложение в фоновом режиме

Добавьте эту строку в конец метода:

Оставляйте комментарии, если у вас есть какие-либо сомнения и предложения по этому руководству.

Примечание. Этот пример (проект) разработан в Android Studio 3.3.2. Протестировано на Android 9 (Android-P), скомпилируйте SDK версии API 28: Android 9.0 (Pie)
MinSdkVersion="15"
TargetSdkVersion="28"
Кодирование на Kotlin


Высшее образование в области компьютерных наук и инженера: разработчик приложений и опыт работы с несколькими языками программирования. Интерес к технологиям и желание учиться техническим наукам.


Я безрезультатно переполнял стек. Кое-что вроде работает, большинство вообще не работает. Кто-нибудь из разработчиков знает, как программно показать и скрыть мягкую клавиатуру? У меня есть ViewFlipper и прослушиватель анимации, когда флип начинается и заканчивается. В основном я хочу следующее:

Страница 1) Я хочу показать клавиатуру и установить фокус на EditText

Страница 2) Я хочу скрыть клавиатуру и потерять фокус EditText

У меня есть прослушиватели, работающие должным образом с правильным состоянием страницы. Что у меня не работает, так это правильное отображение и скрытие клавиатуры. Заранее спасибо за любую информацию.


Использовать эту переменную экземпляра

Отлично, спасибо. у меня было

Я столкнулся с 4.2 и 2.3 с таким же поведением. Еще раз спасибо.

Кроме того, есть ли способ обеспечить анимацию клавиатуры? Клавиши клавиатуры в целом подходят, но когда это заканчивается, фон клавиатуры просто исчезает из поля зрения.

Показать клавиатуру и запросить фокус на EditText

Скрыть клавиатуру и потерять фокус EditText.

Примечание. Если у вас возникли проблемы, я бы посоветовал что-то вроде присоединения исполняемого файла к представлению с помощью post/postDelayed, чтобы клавиатура запрашивалась, когда представление будет готово.

Отвечаю, так как вы лучший комментарий. Прошло некоторое время с тех пор, как я исследовал это, но я считаю, что Android явно рекомендует вам не «показывать клавиатуру». Вы должны установить фокус на вводе и позволить Android решать, что делать.

Пример. Некоторые устройства, хотя и все реже, имеют физическую клавиатуру. делает программный ввод действительно раздражающим.

Я думаю, что лучший (современный) вариант использования — это пользователи вкладок, использующие клавиатуру Bluetooth. SIP не обязательно должен быть там.

Недавно была такая же проблема. Это сработало лучше всего для меня (v == ваш TextView):

Но я не помню, пробовал ли я предложение /u/im_not_afraid для показа клавиатуры..

Будьте осторожны, если вы работаете с эмулятором. Часто для него установлен флаг жесткой клавиатуры, который сопротивляется попыткам показать мягкую клавиатуру больше, чем реальное устройство.На реальном устройстве оптимально просто управлять фокусом и появляется клавиатура. Хотя иногда вам захочется схитрить, чтобы держать клавиатуру включенной при переключении между двумя вещами, которые требуют этого, и тому подобное. Хотя в этом случае я часто могу подклассировать WebView или другое задействованное представление и просто сделать так, чтобы он всегда претендовал на роль текстового редактора. Тем не менее, есть варианты форсирования, как вы видите в остальной части этой темы.

Новости для разработчиков Android: кто, что, где, когда и как в сообществе Android. Новости / Статьи / Обсуждения / Инструменты / С открытым исходным кодом!

Читайте также: