У меня есть EditText
и Button
в моем макете.
После записи в поле редактирования и нажатия на Button
, я хочу скрыть виртуальную клавиатуру. Я предполагаю, что это простой кусок кода, но где я могу найти пример этого?
При касании за пределами клавиатуры.
Ответы:
Чтобы прояснить это безумие, я хотел бы начать с извинения от имени всех пользователей Android за совершенно нелепое обращение Google с программной клавиатурой. Причина того, что на один и тот же простой вопрос так много ответов, разных, потому что этот API, как и многие другие в Android, разработан ужасно. Я не могу придумать никакого вежливого способа заявить об этом.
Я хочу спрятать клавиатуру. Я ожидаю , чтобы обеспечить Android со следующим утверждением:
Keyboard.hide()
. Конец. Большое спасибо. Но у Android есть проблема. Вы должны использовать,InputMethodManager
чтобы скрыть клавиатуру. Хорошо, хорошо, это API Android для клавиатуры. НО! Вы должны иметь дляContext
того, чтобы получить доступ к IMM. Теперь у нас есть проблема. Я могу захотеть скрыть клавиатуру от статического или служебного класса, который не нужен и не нуженContext
. или И еще хуже, IMM требует, чтобы вы указали, чтоView
(или даже хуже, чтоWindow
) вы хотите скрыть клавиатуру ОТ.Это то, что делает скрытие клавиатуры таким сложным. Уважаемый Google: Когда я ищу рецепт торта,
RecipeProvider
на Земле нет ни одного человека , который отказался бы предоставить мне этот рецепт, если я сначала не отвечу, КТО будет съеден торт И где он будет съеден !!Эта печальная история заканчивается ужасной правдой: чтобы спрятать клавиатуру Android, вам потребуется предоставить две формы идентификации: а
Context
и аView
или аWindow
.Я создал метод статической утилиты, который может выполнять работу ОЧЕНЬ надежно, при условии, что вы вызываете его из
Activity
.Имейте в виду, что этот служебный метод работает ТОЛЬКО при вызове из
Activity
! Вышеуказанные вызовы методаgetCurrentFocus
для цели,Activity
чтобы получить правильный маркер окна.Но предположим, что вы хотите скрыть клавиатуру от
EditText
хоста вDialogFragment
? Вы не можете использовать метод выше для этого:Это не сработает, потому что вы будете передавать ссылку на
Fragment
хостActivity
, который не будет иметь сфокусированного контроля, покаFragment
отображается! Вот Это Да! Итак, чтобы скрыть клавиатуру от фрагментов, я прибегаю к более низкому уровню, более распространенному и более уродливому:Ниже приведена дополнительная информация, полученная из-за потраченного времени в погоне за этим решением:
О программе windowSoftInputMode
Есть еще одна точка зрения, о которой нужно знать. По умолчанию Android автоматически назначит начальный фокус первому
EditText
или фокусируемому элементу управления в вашем устройствеActivity
. Естественно, что InputMethod (обычно это программная клавиатура) будет реагировать на событие фокуса, показывая себя.windowSoftInputMode
АтрибутAndroidManifest.xml
, когда установленоstateAlwaysHidden
, инструктирует клавиатуры , чтобы игнорировать это автоматически присвоенный первоначальный фокус.Почти невероятно, что ничего не делает для предотвращения открытия клавиатуры при прикосновении к элементу управления (если только
focusable="false"
и / илиfocusableInTouchMode="false"
не назначены элементу управления). По-видимому, настройка windowSoftInputMode применяется только к событиям автоматической фокусировки, а не к событиям фокусировки, вызванным событиями касания.Следовательно,
stateAlwaysHidden
ОЧЕНЬ плохо назван действительно. Возможно, это следует назватьignoreInitialFocus
вместо.Надеюсь это поможет.
ОБНОВЛЕНИЕ: Больше способов получить жетон окна
Если нет сфокусированного представления (например, это может произойти, если вы только что изменили фрагменты), есть другие представления, которые предоставят полезный маркер окна.
Это альтернативы для приведенного выше кода.
if (view == null) view = new View(activity);
Они не относятся явно к вашей деятельности.Внутри класса фрагмента:
Задан фрагмент
fragment
в качестве параметра:Начиная с вашего содержания:
ОБНОВЛЕНИЕ 2: Очистить фокус, чтобы снова не показывать клавиатуру, если вы открываете приложение из фона
Добавьте эту строку в конец метода:
view.clearFocus();
источник
Fragment
кажется, что вы можете использоватьgetActivity().getWindow().getDecorView()
Keyboard.hide();
утилитуВы можете заставить Android скрыть виртуальную клавиатуру, используя InputMethodManager , вызывая
hideSoftInputFromWindow
, передавая токен окна, содержащего ваше сфокусированное представление.Это заставит клавиатуру быть скрытой во всех ситуациях. В некоторых случаях вы захотите передать
InputMethodManager.HIDE_IMPLICIT_ONLY
второй параметр, чтобы скрыть клавиатуру только в том случае, если пользователь явно не заставлял ее появляться (удерживая меню).Примечание: если вы хотите сделать это в Kotlin, используйте:
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
Котлин Синтаксис
источник
editText.clearFocus()
потомInputMethodManager.HIDE_IMPLICIT_ONLY
даже работает4.1
View focused = getCurrentFocus()
чтобы получить то, что определенно является в настоящее время сфокусированным представлением, вызовомfocused.clearFocus()
и затемinputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)
(с четкими флагами).Также полезно скрыть софт-клавиатуру:
Это можно использовать для подавления программной клавиатуры до тех пор, пока пользователь фактически не коснется представления редактирования текста.
источник
У меня есть еще одно решение, чтобы скрыть клавиатуру:
Здесь проходят
HIDE_IMPLICIT_ONLY
в положенииshowFlag
и0
в положенииhiddenFlag
. Это принудительно закроет мягкую клавиатуру.источник
Решение Майера работает и для меня. В моем случае верхний уровень моего приложения - это tabHost, и я хочу скрыть ключевое слово при переключении вкладок - я получаю маркер окна из представления tabHost.
источник
Пожалуйста, попробуйте этот код ниже
onCreate()
источник
editView.setInputType(InputType.TYPE_NULL);
Обновление: я не знаю, почему это решение больше не работает (я только что протестировал на Android 23). Пожалуйста, используйте вместо этого решение Saurabh Pareek . Вот:
Старый ответ:
источник
I don't know why this solution is not work any more
- потому что это Android , все сможет измениться, возможно, отчасти из-за плохого дизайна ... Мы пишем небрежно, затем вычеркиваем все и переписываем все.источник
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
.input.setInputType(0);
из этого кода. Это изменило поведение клавиатуры иinputType
дляEditText
.Если все остальные ответы здесь не работают так, как вам хотелось бы, есть другой способ ручного управления клавиатурой.
Создайте функцию, которая будет управлять некоторыми из
EditText
свойств:Затем убедитесь, что на Focus
EditText
вы открываете / закрываете клавиатуру:Теперь, когда вы хотите открыть клавиатуру вручную, позвоните:
И для закрытия звонка:
источник
Пока у Саураба Парика лучший ответ.
Можно использовать и правильные флаги.
Пример реального использования
источник
fragment.getActivity().getSystemService();
от такого поиска, здесь я нашел ответ, который работает для меня
источник
Краткий ответ
В вашем
OnClick
слушателе вызватьonEditorAction
изEditText
сIME_ACTION_DONE
Развертка
Я чувствую, что этот метод лучше, проще и более соответствует шаблону дизайна Android. В приведенном выше простом примере (и, как правило, в большинстве распространенных случаев) у вас будет
EditText
фокус, который имеет / имел фокус, и он также обычно вызывал клавиатуру в первую очередь (он определенно способен вызывать ее во многих случаях). общие сценарии). Таким же образом, это должен быть тот, кто отпускает клавиатуру, обычно это может сделать операторImeAction
. Просто посмотрите, как ведет себя командаEditText
withandroid:imeOptions="actionDone"
, вы хотите добиться того же поведения тем же способом.Проверьте этот связанный ответ
источник
Это должно работать:
источник
hide()
иshow()
методами , чтобы иметь больше контроля над тем, когда он должен показать , а когда нет. У меня работает, я тоже это сделал :) Пример редактированияKeyBoard.toggle(fragment.getActivity())
Fragment
, как в комментариях. Узнайте, как использовать методы, пожалуйста, а затем вернуться. Ты путаешь людей со своими глупыми ответамиЯ использую пользовательскую клавиатуру для ввода шестнадцатеричного числа, поэтому я не могу показать клавиатуру IMM ...
В v3.2.4_r1
setSoftInputShownOnFocus(boolean show)
был добавлен контроль погоды или не отображать клавиатуру, когда TextView получает фокус, но он все еще скрыт, поэтому необходимо использовать отражение:Для более старых версий я получил очень хорошие (но далеко не идеальные) результаты с a
OnGlobalLayoutListener
, добавленным с помощью aViewTreeObserver
из моего корневого представления, а затем проверив, отображается ли клавиатура следующим образом:Это последнее решение может показывать клавиатуру в течение доли секунды и портить ручки выбора.
Когда в клавиатуру входит полный экран, onGlobalLayout не вызывается. Чтобы избежать этого, используйте TextView # setImeOptions (int) или в объявлении TextView XML:
Обновление: только что нашел, какие диалоги используют, чтобы никогда не показывать клавиатуру и работает во всех версиях:
источник
источник
Я потратил более двух дней, работая над всеми решениями, опубликованными в ветке, и обнаружил, что их так или иначе не хватает. Мое точное требование - иметь кнопку, которая со 100% надежностью отображает или скрывает экранную клавиатуру. Когда клавиатура находится в скрытом состоянии, она не должна появляться снова, независимо от того, какие поля ввода пользователь нажимает. Когда он находится в своем видимом состоянии, клавиатура не должна исчезать независимо от того, на какие кнопки нажимает пользователь. Это должно работать на Android 2.2+ вплоть до самых последних устройств.
Вы можете увидеть рабочую реализацию этого в моем приложении чистой RPN .
После тестирования многих из предложенных ответов на разных телефонах (включая устройства froyo и пряники) стало очевидно, что приложения для Android могут надежно:
Для меня временно скрыть клавиатуру недостаточно. На некоторых устройствах оно появится снова, как только будет выделено новое текстовое поле. Поскольку мое приложение использует несколько текстовых полей на одной странице, при фокусировке на новом текстовом поле скрытая клавиатура снова выскочит.
К сожалению, пункты 2 и 3 в списке работают только надёжно, когда работа начинается. После того, как действие стало видимым, вы не сможете постоянно скрывать или показывать клавиатуру. Хитрость заключается в том, чтобы фактически возобновить свою деятельность, когда пользователь нажимает кнопку переключения клавиатуры. В моем приложении, когда пользователь нажимает кнопку переключения клавиатуры, выполняется следующий код:
Это приводит к тому, что текущее действие сохраняет свое состояние в Bundle, а затем действие запускается, проходя через логическое значение, которое указывает, должна ли клавиатура отображаться или скрываться.
Внутри метода onCreate запускается следующий код:
Если должна отображаться программная клавиатура, то InputMethodManager должен показать клавиатуру, а в окне указывается, чтобы программный ввод был всегда видимым. Если программная клавиатура должна быть скрыта, то устанавливается WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM.
Этот подход надежно работает на всех устройствах, на которых я тестировал - от 4-летнего телефона HTC с Android 2.2 до Nexus 7 с 4.2.2. Единственный недостаток этого подхода - вы должны быть осторожны при обращении с кнопкой «назад». Поскольку мое приложение по существу имеет только один экран (это калькулятор), я могу переопределить onBackPressed () и вернуться на домашний экран устройства.
источник
В качестве альтернативы этому универсальному решению , если вы хотите закрыть программную клавиатуру из любого места, не имея ссылки на поле (EditText), которое использовалось для открытия клавиатуры, но все же хотите сделать это, если поле было сфокусировано, вы можете использовать это (из Деятельности):
источник
Благодаря такому ответу я получил следующее, что в моем случае прекрасно работает при прокрутке фрагментов ViewPager ...
источник
Приведенные выше ответы работают для разных сценариев, но если вы хотите скрыть клавиатуру в представлении и изо всех сил пытаетесь получить правильный контекст, попробуйте это:
и получить контекст, получить его из конструктора :)
источник
Если вы хотите закрыть экранную клавиатуру во время модульного или функционального теста, вы можете сделать это, нажав кнопку «Назад» в вашем тесте:
Я поставил «кнопку назад» в кавычки, так как выше не вызывает
onBackPressed()
для рассматриваемой деятельности. Он просто закрывает клавиатуру.Обязательно сделайте небольшую паузу, прежде чем двигаться дальше, поскольку для закрытия кнопки «назад» требуется некоторое время, поэтому последующие нажатия на «Виды» и т. Д. Не будут регистрироваться до тех пор, пока не произойдет короткая пауза (1 секунда достаточно длинная ).
источник
Вот как вы делаете это в Mono для Android (AKA MonoDroid)
источник
searchbox
во фрагменте?Это сработало для меня из-за странного поведения клавиатуры
источник
Добавьте к своей деятельности
android:windowSoftInputMode="stateHidden"
в файле манифеста. Пример:источник
Простой и легкий в использовании метод, просто вызовите hideKeyboardFrom (YourActivity.this); прятать клавиатуру
источник
Просто используйте этот оптимизированный код в своей деятельности:
источник
после этого вызовите onTouchListener:
источник
использовать этот
источник
Для моего случая я использовал SearchView на панели действий. После того, как пользователь выполнит поиск, клавиатура снова откроется.
Использование InputMethodManager не закрывало клавиатуру. Мне пришлось очистить фокус и установить фокусировку в поиске на false:
источник
clearFocus()
на страницах API Android, так что это не сработало для меня, но другое решение было (см. Мой ответ ниже).У меня есть случай, когда мой
EditText
может быть расположен также вAlertDialog
, так что клавиатура должна быть закрыта при отклонении. Следующий код, кажется, работает где угодно:источник
Я почти перепробовал все эти ответы, у меня были некоторые случайные проблемы, особенно с Samsung Galaxy S5.
В итоге я заставляю себя показывать и прятаться, и это прекрасно работает:
источник