Две проблемы с этим .... одна заключается в том, что myEditText должен быть Final. Во-вторых, я должен знать, какое поле EditText имеет фокус. Любое решение этого?
Итан Аллен
78
Для любого другого, кто спотыкается здесь, вы можете использовать действие (или активность, в которой вы находитесь, или фрагменты getActivity()) getCurrentFocus().getWindowToken()для первого аргумента hideSoftInputFromWindow(). Кроме того, делайте это в, onPause()а не в том onStop()случае, если вы пытаетесь заставить его исчезнуть при смене действий.
Дрейк Кларрис
2
Этот ответ, в сочетании с комментарием здесь, полностью решил мою проблему!
Авещини
9
Какой уродливый, уродливый подход к распусканию клавиатуры. Я надеюсь, что в будущем есть более чистый способ сделать такую простую вещь.
Subby
73
Решение, приведенное выше, работает не для всех устройств, кроме того, оно использует EditText в качестве параметра. Это мое решение, просто вызовите этот простой метод:
privatevoid hideSoftKeyBoard(){InputMethodManager imm =(InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);if(imm.isAcceptingText()){// verify if the soft keyboard is open
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);}}
Хорошее решение ... в редких случаях isAcceptingText () может возвращать значение false, когда клавиатура все еще находится на экране, например, щелкнуть от EditText до текста, который можно выбрать, но не редактировать в том же окне.
Вот решение Kotlin (смешивая различные ответы в теме)
Создать функцию расширения (возможно, в общем классе ViewHelpers)
fun Activity.dismissKeyboard(){
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE )asInputMethodManagerif( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow(this.currentFocus.windowToken,/*flags:*/0)}
Тогда просто потребляйте используя:
// from activitythis.dismissKeyboard()// from fragment
activity.dismissKeyboard()
Первое решение с InputMethodManager работало для меня как победитель, метод getWindow (). SetSoftInputMode не работал на Android 4.0.3 HTC Amaze.
@ За исключением Аллена, мне не нужно было окончательно редактировать текст. Может быть, вы используете внутренний класс EditText, который вы объявили содержащий метод? Вы можете сделать EditText переменной класса Activity. Или просто объявите новый EditText внутри внутреннего класса / метода и снова используйте findViewById (). Кроме того, я не нашел, что мне нужно было знать, какой EditText в форме был в фокусе. Я мог бы просто выбрать один произвольно и использовать его. Вот так:
Добро пожаловать в стек переполнения! Это действительно комментарий, а не ответ. С немного большим количеством представителей вы сможете оставлять комментарии .
Это решение убедитесь, что оно скрывает клавиатуру и ничего не делать, если она не открыта. Он использует расширение, поэтому его можно использовать из любого класса владельца контекста.
fun Context.dismissKeyboard(){
val imm by lazy {this.getSystemService(Context.INPUT_METHOD_SERVICE)asInputMethodManager}
val windowHeightMethod =InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm)asIntif(height >0){
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0)}}
Используя контекст представления, мы можем достичь желаемого результата с помощью следующих методов расширения в Kotlin:
/**
* Get the [InputMethodManager] using some [Context].
*/
fun Context.getInputMethodManager():InputMethodManager{if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.M){return getSystemService(InputMethodManager::class.java)}return getSystemService(Context.INPUT_METHOD_SERVICE)asInputMethodManager}/**
* Dismiss soft input (keyboard) from the window using a [View] context.
*/
fun View.dismissKeyboard()= context
.getInputMethodManager().hideSoftInputFromWindow(
windowToken
,0)
Ответы:
Вы хотите отключить или закрыть виртуальную клавиатуру?
Если вы хотите просто отклонить его, вы можете использовать следующие строки кода в кнопке при нажатии кнопки «Событие».
источник
getActivity()
)getCurrentFocus().getWindowToken()
для первого аргументаhideSoftInputFromWindow()
. Кроме того, делайте это в,onPause()
а не в томonStop()
случае, если вы пытаетесь заставить его исчезнуть при смене действий.Решение, приведенное выше, работает не для всех устройств, кроме того, оно использует EditText в качестве параметра. Это мое решение, просто вызовите этот простой метод:
источник
isAcceptingText()
сделал этот ответ лучше другихЭто мое решение
источник
Вы также можете использовать этот код на событие нажатия кнопки
источник
Вот решение Kotlin (смешивая различные ответы в теме)
Создать функцию расширения (возможно, в общем классе ViewHelpers)
Тогда просто потребляйте используя:
источник
Первое решение с InputMethodManager работало для меня как победитель, метод getWindow (). SetSoftInputMode не работал на Android 4.0.3 HTC Amaze.
@ За исключением Аллена, мне не нужно было окончательно редактировать текст. Может быть, вы используете внутренний класс EditText, который вы объявили содержащий метод? Вы можете сделать EditText переменной класса Activity. Или просто объявите новый EditText внутри внутреннего класса / метода и снова используйте findViewById (). Кроме того, я не нашел, что мне нужно было знать, какой EditText в форме был в фокусе. Я мог бы просто выбрать один произвольно и использовать его. Вот так:
источник
источник
Это решение убедитесь, что оно скрывает клавиатуру и ничего не делать, если она не открыта. Он использует расширение, поэтому его можно использовать из любого класса владельца контекста.
источник
Используя контекст представления, мы можем достичь желаемого результата с помощью следующих методов расширения в Kotlin:
Как только они на месте, просто позвоните:
источник