Dois problemas com isso .... um é que o myEditText precisa ser final. O segundo é que eu tenho que saber qual caixa EditText tem o foco. Alguma solução para isso?
Ethan Allen
78
Para qualquer pessoa que tropeçar aqui, você pode usar as atividades (a atividade em que está ou os fragmentos getActivity()) getCurrentFocus().getWindowToken()para o primeiro argumento hideSoftInputFromWindow(). Além disso, faça isso no onPause()e não no onStop()se você estiver tentando fazê-lo desaparecer ao alterar as atividades.
Drake Clarris
2
Esta resposta, combinada com o comentário aqui em cima, resolveu totalmente o meu problema!
Aveschini 03/10
9
Que abordagem feia e feia para descartar um teclado. Espero que no futuro haja uma maneira mais limpa de fazer uma coisa tão simples.
Subby
73
A solução acima não funciona para todos os dispositivos e, além disso, está usando o EditText como parâmetro. Esta é a minha solução, basta chamar este método simples:
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()fez esta resposta melhor do que outros
user1506104
Boa solução ... em casos raros, o isAcceptingText () pode retornar falso quando o teclado ainda está na tela, por exemplo, clique fora do EditText para o texto que pode ser selecionado, mas não editado na mesma janela.
Aqui está uma solução Kotlin (misturando as várias respostas em um tópico)
Crie uma função de extensão (talvez em uma classe comum do ViewHelpers)
fun Activity.dismissKeyboard(){
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE )asInputMethodManagerif( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow(this.currentFocus.windowToken,/*flags:*/0)}
Em seguida, consuma usando:
// from activitythis.dismissKeyboard()// from fragment
activity.dismissKeyboard()
A primeira solução com o InputMethodManager funcionou como um campeão para mim, o método getWindow (). SetSoftInputMode não funcionou no Android 4.0.3 HTC Amaze.
@ Ethan Allen, não precisava finalizar a edição do texto. Talvez você esteja usando uma classe interna EditText que você declarou como método de contenção? Você pode tornar o EditText uma variável de classe da Atividade. Ou apenas declare um novo EditText dentro da classe / método interno e use findViewById () novamente. Além disso, não achei que precisava saber qual EditText no formulário tinha foco. Eu poderia escolher um arbitrariamente e usá-lo. Igual a:
Esta solução garante que oculta o teclado e não faça nada se não estiver aberto. Ele usa extensão para poder ser usado em qualquer classe de Proprietário do Contexto.
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)}}
Usando o contexto da visualização, podemos obter o resultado desejado com os seguintes métodos de extensão no 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)
Quando estes estiverem no lugar, basta ligar para:
Respostas:
Deseja desativar ou descartar um teclado virtual?
Se você quiser apenas descartá-lo, poderá usar as seguintes linhas de código nos botões, no clique em Evento
fonte
getActivity()
)getCurrentFocus().getWindowToken()
para o primeiro argumentohideSoftInputFromWindow()
. Além disso, faça isso noonPause()
e não noonStop()
se você estiver tentando fazê-lo desaparecer ao alterar as atividades.A solução acima não funciona para todos os dispositivos e, além disso, está usando o EditText como parâmetro. Esta é a minha solução, basta chamar este método simples:
fonte
isAcceptingText()
fez esta resposta melhor do que outrosEsta é a minha solução
fonte
você também pode usar esse código no evento de clique no botão
fonte
Aqui está uma solução Kotlin (misturando as várias respostas em um tópico)
Crie uma função de extensão (talvez em uma classe comum do ViewHelpers)
Em seguida, consuma usando:
fonte
A primeira solução com o InputMethodManager funcionou como um campeão para mim, o método getWindow (). SetSoftInputMode não funcionou no Android 4.0.3 HTC Amaze.
@ Ethan Allen, não precisava finalizar a edição do texto. Talvez você esteja usando uma classe interna EditText que você declarou como método de contenção? Você pode tornar o EditText uma variável de classe da Atividade. Ou apenas declare um novo EditText dentro da classe / método interno e use findViewById () novamente. Além disso, não achei que precisava saber qual EditText no formulário tinha foco. Eu poderia escolher um arbitrariamente e usá-lo. Igual a:
fonte
fonte
Esta solução garante que oculta o teclado e não faça nada se não estiver aberto. Ele usa extensão para poder ser usado em qualquer classe de Proprietário do Contexto.
fonte
Usando o contexto da visualização, podemos obter o resultado desejado com os seguintes métodos de extensão no Kotlin:
Quando estes estiverem no lugar, basta ligar para:
fonte