Eu tenho um EditText
e um Button
no meu layout.
Depois de escrever no campo de edição e clicar em Button
, quero ocultar o teclado virtual. Suponho que este é um trecho simples de código, mas onde posso encontrar um exemplo disso?
Ao tocar fora do teclado.
Respostas:
Para ajudar a esclarecer essa loucura, gostaria de começar pedindo desculpas, em nome de todos os usuários do Android, pelo tratamento ridículo do Google com o teclado virtual. A razão pela qual existem tantas respostas, cada uma diferente, para a mesma pergunta simples é porque essa API, como muitas outras no Android, é horrivelmente projetada. Não consigo pensar em nenhuma maneira educada de dizer isso.
Eu quero esconder o teclado. Espero para fornecer Android com a seguinte declaração:
Keyboard.hide()
. O fim. Muito obrigado. Mas o Android tem um problema. Você deve usar oInputMethodManager
para ocultar o teclado. OK, tudo bem, esta é a API do Android para o teclado. MAS! Você precisa ter umContext
para obter acesso ao IMM. Agora nós temos um problema. Talvez eu queira ocultar o teclado de uma classe estática ou de utilitário que não tenha utilidade ou necessidadeContext
. ou E Pior ainda, o IMM exige que você especifique o queView
(ou pior, o queWindow
) deseja ocultar do teclado.É isso que torna a ocultação do teclado um desafio. Caro Google: Quando estou pesquisando a receita de um bolo, não há
RecipeProvider
na Terra que se recusaria a me fornecer a receita, a menos que eu responda primeiro a QUEM o bolo será comido E onde será comido !!Essa triste história termina com a feia verdade: para ocultar o teclado do Android, você precisará fornecer duas formas de identificação:
Context
ae aView
ou a ou aWindow
.Eu criei um método de utilitário estático que pode fazer o trabalho MUITO solidamente, desde que você o chame de
Activity
.Esteja ciente de que este método utilitário só funciona quando chamado de um
Activity
! O método acima chamagetCurrentFocus
o destinoActivity
para buscar o token de janela apropriado.Mas suponha que você queira ocultar o teclado de um
EditText
host em umDialogFragment
? Você não pode usar o método acima para isso:Isso não funcionará porque você passará uma referência ao
Fragment
host doActivity
que não terá controle focado enquanto oFragment
é mostrado! Uau! Portanto, para ocultar fragmentos do teclado, recorro ao nível inferior, mais comum e mais feio:Abaixo estão algumas informações adicionais obtidas com mais tempo desperdiçado na busca desta solução:
Sobre windowSoftInputMode
Há ainda outro ponto de discórdia a ter em conta. Por padrão, o Android atribui automaticamente o foco inicial ao primeiro
EditText
ou controle focalizável no seuActivity
. Segue-se naturalmente que o InputMethod (normalmente o teclado virtual) responderá ao evento de foco, mostrando-se. OwindowSoftInputMode
atributo emAndroidManifest.xml
, quando definido comostateAlwaysHidden
, instrui o teclado a ignorar esse foco inicial atribuído automaticamente.Quase inacreditavelmente, parece não fazer nada para impedir a abertura do teclado quando você toca no controle (a menos que
focusable="false"
e / oufocusableInTouchMode="false"
esteja atribuído ao controle). Aparentemente, a configuração windowSoftInputMode se aplica apenas a eventos de foco automático, não a eventos de foco acionados por eventos de toque.Portanto,
stateAlwaysHidden
é MUITO mal nomeado de fato. Talvez devesse ser chamado em seuignoreInitialFocus
lugar.Espero que isto ajude.
UPDATE: Mais maneiras de obter um token de janela
Se não houver uma visão focada (por exemplo, pode acontecer se você acabou de alterar fragmentos), existem outras visualizações que fornecerão um token de janela útil.
Essas são alternativas para o código acima.
if (view == null) view = new View(activity);
Elas não se referem explicitamente à sua atividade.Dentro de uma classe de fragmento:
Dado um fragmento
fragment
como parâmetro:A partir do seu corpo de conteúdo:
ATUALIZAÇÃO 2: foco claro para evitar a exibição do teclado novamente se você abrir o aplicativo a partir do segundo plano
Adicione esta linha ao final do método:
view.clearFocus();
fonte
Fragment
parece que você pode usargetActivity().getWindow().getDecorView()
Keyboard.hide();
utilidadeVocê pode forçar o Android a ocultar o teclado virtual usando o InputMethodManager , chamando
hideSoftInputFromWindow
, passando o token da janela que contém sua exibição focada.Isso forçará o teclado a ficar oculto em todas as situações. Em alguns casos, você desejará passar
InputMethodManager.HIDE_IMPLICIT_ONLY
como o segundo parâmetro para garantir que você oculte apenas o teclado quando o usuário não forçar explicitamente a aparecer (pressionando o menu).Nota: Se você quiser fazer isso no Kotlin, use:
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
Sintaxe de Kotlin
fonte
editText.clearFocus()
em seguida,InputMethodManager.HIDE_IMPLICIT_ONLY
funciona até mesmo no4.1
View focused = getCurrentFocus()
para obter o que é definitivamente a visão atualmente focada, chamandofocused.clearFocus()
e depoisinputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)
(com sinalizadores claros).Também útil para ocultar o teclado virtual é:
Isso pode ser usado para suprimir o teclado virtual até que o usuário realmente toque na visualização EditText.
fonte
Eu tenho mais uma solução para ocultar o teclado:
Aqui passe
HIDE_IMPLICIT_ONLY
na posição deshowFlag
e0
na posição dehiddenFlag
. Ele fechará com força o teclado virtual.fonte
A solução de Meier também funciona para mim. No meu caso, o nível superior do meu aplicativo é um tabHost e quero ocultar a palavra-chave ao alternar entre guias - recebo o token da janela na visualização tabHost.
fonte
Tente este código abaixo em
onCreate()
fonte
editView.setInputType(InputType.TYPE_NULL);
Atualização: não sei por que essa solução não funciona mais (acabei de testar no Android 23). Por favor, use a solução de Saurabh Pareek . Aqui está:
Resposta antiga:
fonte
I don't know why this solution is not work any more
- como é o Android , tudo será capaz de mudar, talvez em parte com um design ruim ... Escrevemos de forma descuidada, depois eliminamos tudo e reescrevemos tudo.fonte
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
.input.setInputType(0);
deste código. Ele mudou o comportamento do teclado einputType
para oEditText
.Se todas as outras respostas aqui não funcionarem para você como você gostaria, há outra maneira de controlar manualmente o teclado.
Crie uma função que gerencie algumas das
EditText
propriedades de:Em seguida, certifique-se de que, ao focar,
EditText
abra / feche o teclado:Agora, sempre que você quiser abrir o teclado manualmente, ligue para:
E para fechar a chamada:
fonte
Saurabh Pareek tem a melhor resposta até agora.
No entanto, é melhor usar as bandeiras corretas.
Exemplo de uso real
fonte
fragment.getActivity().getSystemService();
de tão pesquisando, aqui encontrei uma resposta que funciona para mim
fonte
A resposta curta
No seu
OnClick
ouvinte, chame oonEditorAction
deEditText
comIME_ACTION_DONE
O detalhamento
Eu sinto que esse método é melhor, mais simples e mais alinhado com o padrão de design do Android. No exemplo simples acima (e geralmente na maioria dos casos comuns), você terá um
EditText
foco que teve / teve e também foi o primeiro a invocar o teclado em primeiro lugar (é definitivamente capaz de invocá-lo em muitos cenários comuns). No mesmo caminho, ele deve ser o único a liberar o teclado, geralmente, que pode ser feito por umImeAction
. Basta ver como umEditText
comandroid:imeOptions="actionDone"
se comporta, você quer conseguir o mesmo comportamento pelos mesmos meios.Verifique esta resposta relacionada
fonte
Isso deve funcionar:
fonte
hide()
e osshow()
métodos para ter mais controle sobre quando ela deve aparecer e quando não. Funciona para mim, eu fiz isso também :) Vou editar o exemploKeyBoard.toggle(fragment.getActivity())
Fragment
, como um comentado. Aprenda a usar métodos, por favor, e depois volte. Você está confundindo as pessoas com suas respostas bobasEstou usando um teclado personalizado para inserir um número hexadecimal, para que o teclado IMM não seja exibido ...
Na v3.2.4_r1,
setSoftInputShownOnFocus(boolean show)
foi adicionado para controlar o clima ou não para exibir o teclado quando um TextView obtém o foco, mas ainda está oculto, portanto a reflexão deve ser usada:Para versões mais antigas, obtive resultados muito bons (mas longe de serem perfeitos) com a
OnGlobalLayoutListener
, adicionados com a ajuda de aViewTreeObserver
da minha visualização raiz e verificando se o teclado é mostrado assim:Esta última solução pode mostrar o teclado por uma fração de segundo e mexer com as alças de seleção.
Quando o teclado entra em tela cheia, onGlobalLayout não é chamado. Para evitar isso, use TextView # setImeOptions (int) ou na declaração XML do TextView:
Atualização: Acabei de descobrir quais caixas de diálogo são usadas para nunca mostrar o teclado e funcionam em todas as versões:
fonte
fonte
Passei mais de dois dias trabalhando em todas as soluções postadas no segmento e as encontrei ausentes de uma maneira ou de outra. Meu requisito exato é ter um botão que mostre com 100% de confiabilidade ou oculte o teclado na tela. Quando o teclado está no estado oculto, ele não deve reaparecer, independentemente dos campos de entrada nos quais o usuário clica. Quando está no estado visível, o teclado não deve desaparecer, independentemente dos botões em que o usuário clica. Isso precisa funcionar no Android 2.2 ou superior até os dispositivos mais recentes.
Você pode ver uma implementação funcional disso no meu aplicativo, RPN limpo .
Depois de testar muitas das respostas sugeridas em vários telefones diferentes (incluindo dispositivos froyo e gingerbread), ficou claro que os aplicativos para Android podem:
Para mim, ocultar temporariamente o teclado não é suficiente. Em alguns dispositivos, ele reaparece assim que um novo campo de texto é focado. Como meu aplicativo usa vários campos de texto em uma página, o foco em um novo campo de texto fará com que o teclado oculto volte a aparecer.
Infelizmente, os itens 2 e 3 da lista só funcionam com confiabilidade quando uma atividade está sendo iniciada. Depois que a atividade se tornar visível, você não poderá ocultar ou mostrar permanentemente o teclado. O truque é realmente reiniciar sua atividade quando o usuário pressionar o botão de alternância do teclado. No meu aplicativo, quando o usuário pressiona o botão de alternância do teclado, o seguinte código é executado:
Isso faz com que a atividade atual tenha seu estado salvo em um pacote e, em seguida, a atividade é iniciada, passando por um booleano que indica se o teclado deve ser mostrado ou oculto.
Dentro do método onCreate, o seguinte código é executado:
Se o teclado virtual for mostrado, o InputMethodManager é instruído a mostrar o teclado e a janela é instruída a tornar a entrada virtual sempre visível. Se o teclado virtual estiver oculto, o WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM está definido.
Essa abordagem funciona de forma confiável em todos os dispositivos em que testei - de um telefone HTC de 4 anos com Android 2.2 até um nexus 7 com 4.2.2. A única desvantagem dessa abordagem é que você precisa ter cuidado ao manusear o botão Voltar. Como meu aplicativo basicamente possui apenas uma tela (é uma calculadora), posso substituir onBackPressed () e retornar à tela inicial do dispositivo.
fonte
Como alternativa a essa solução geral , se você deseja fechar o teclado virtual de qualquer lugar sem ter uma referência ao campo (EditText) usado para abrir o teclado, mas ainda assim deseja fazê-lo se o campo estiver focado, você poderá usar this (de uma atividade):
fonte
Graças a esta resposta do SO , deduzi o seguinte que, no meu caso, funciona bem ao rolar pelos fragmentos de um ViewPager ...
fonte
As respostas acima funcionam para cenários diferentes, mas se você deseja ocultar o teclado dentro de uma visualização e se esforçando para obter o contexto certo, tente o seguinte:
e para obter o contexto, busque-o no construtor :)
fonte
Se você deseja fechar o teclado virtual durante uma unidade ou teste funcional, clique no "botão voltar" do seu teste:
Coloquei o "botão voltar" entre aspas, pois o acima não aciona o
onBackPressed()
da Atividade em questão. Apenas fecha o teclado.Faça uma pausa por um tempo antes de prosseguir, pois leva um pouco para fechar o botão Voltar, para que cliques subsequentes em Visualizações, etc., não sejam registrados até depois de uma breve pausa (1 segundo é o suficiente) )
fonte
Veja como fazer isso no Mono para Android (AKA MonoDroid)
fonte
searchbox
no snippet?Isso funcionou para mim em todo o comportamento bizarro do teclado
fonte
Adicione à sua atividade
android:windowSoftInputMode="stateHidden"
no arquivo Manifest. Exemplo:fonte
Método simples e fácil de usar, basta chamar hideKeyboardFrom (YourActivity.this); esconder o teclado
fonte
Basta usar este código otimizado em sua atividade:
fonte
após essa chamada no onTouchListener:
fonte
usa isto
fonte
Para o meu caso, eu estava usando o a SearchView na barra de ação. Depois que um usuário realiza uma pesquisa, o teclado é aberto novamente.
O uso do InputMethodManager não fechou o teclado. Eu tive que limpar o Focus e definir o foco da visualização de pesquisa como false:
fonte
clearFocus()
nas páginas da API do Android; portanto, isso não funcionou para mim, mas outra solução funcionou (veja minha resposta abaixo).Eu tenho o caso, onde meu também
EditText
pode ser localizado em umAlertDialog
, portanto, o teclado deve ser fechado ao ser descartado. O código a seguir parece estar funcionando em qualquer lugar:fonte
Eu quase tentei todas essas respostas, tive alguns problemas aleatórios, especialmente com o Samsung Galaxy S5.
Acabo forçando o show e me escondendo, e funciona perfeitamente:
fonte