Existe uma maneira no Android de detectar se o teclado do software (também conhecido como "soft") está visível na tela?
android
keyboard
android-softkeyboard
andreea
fonte
fonte
Respostas:
Não existe uma maneira direta - consulte http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a em que Dianne Hackborn, da equipe do Android, respondeu. No entanto, você pode detectá-lo indiretamente, verificando se o tamanho da janela foi alterado em #onMeasure. Consulte Como verificar a visibilidade do teclado do software no Android? .
fonte
Isso funciona para mim. Talvez essa seja sempre a melhor maneira para todas as versões .
Seria eficaz criar uma propriedade de visibilidade do teclado e observar essas alterações atrasadas porque o método onGlobalLayout chama muitas vezes. Também é bom verificar a rotação do dispositivo e
windowSoftInputMode
não éadjustNothing
.fonte
contentView
declarado?tente isto:
fonte
Criei uma classe simples que pode ser usada para isso: https://github.com/ravindu1024/android-keyboardlistener . Basta copiá-lo para o seu projeto e usar da seguinte maneira:
fonte
Muito fácil
1. Coloque o ID na sua visualização raiz
rootView
é apenas uma visualização apontando para minha visualização raiz, neste caso, arelative layout
:2. Inicialize sua visualização raiz em sua atividade:
RelativeLayout rootView = (RelativeLayout) findViewById(R.id.addresses_confirm_root_view);
3. Detecte se o teclado está aberto ou fechado usando
getViewTreeObserver()
fonte
1
. Não importa. Somente este deve ser menor do que o comprimento real do tecladoEu usei isso como base: http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
Então escreveu este método:
Você pode usá-lo para testar todos os campos (EditText, AutoCompleteTextView, etc) que podem ter aberto uma tecla programável:
Obviamente, não é uma solução ideal, mas faz o trabalho.
fonte
Você pode usar o resultado de retorno de chamada showSoftInput () e hideSoftInput () para verificar o status do teclado. Detalhes completos e código de exemplo em
http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
fonte
Você pode consultar esta resposta - https://stackoverflow.com/a/24105062/3629912
Funcionou para mim todas as vezes.
Retornará true, se o teclado do software estiver visível.
fonte
Então, depois de muito tempo brincando com os Serviços de Acessibilidade, inserções de janelas, detecção de altura da tela etc., acho que encontrei uma maneira de fazer isso.
Isenção de responsabilidade: ele usa um método oculto no Android, o que significa que pode não ser consistente. No entanto, nos meus testes, parece funcionar.
O método é InputMethodManager # getInputMethodWindowVisibleHeight () e existe desde o Lollipop (5.0).
Chamada que retorna a altura, em pixels, do teclado atual. Em teoria, um teclado não deve ter 0 pixels de altura, então fiz uma verificação simples da altura (no Kotlin):
Uso a API oculta do Android para evitar a reflexão quando chamo métodos ocultos (faço muito isso para os aplicativos que desenvolvo, que são principalmente aplicativos de hacky / tuner), mas isso também deve ser possível com a reflexão:
fonte
Isso foi muito menos complicado para os requisitos que eu precisava. Espero que isso possa ajudar:
Em MainActivity:
O valor booleano primitivo padrão para mKeyboardStatus será inicializado como false .
Em seguida, verifique o valor da seguinte maneira e execute uma ação, se necessário:
fonte
Isso deve funcionar se você precisar verificar o status do teclado:
Onde
UiUtils.KEYBOARD_VISIBLE_THRESHOLD_DP
= 100 e dip () é uma função anko que converte dpToPx:fonte
Fiz isso definindo um GlobalLayoutListener, da seguinte maneira:
fonte
Experimente este código que está realmente funcionando se KeyboardShown for Shown, então essa função retornará valor verdadeiro ....
fonte
No meu caso, eu tinha apenas um
EditText
para gerenciar no meu layout, então vim com esta solução. Funciona bem, basicamente é um costumeEditText
que escuta o foco e envia uma transmissão local se o foco mudar ou se o botão Voltar / Concluído for pressionado. Para trabalhar, você precisa colocar um manequimView
no layout comandroid:focusable="true"
eandroid:focusableInTouchMode="true"
porque, quando você ligar,clearFocus()
o foco será reatribuído para a primeira visualização focalizável. Exemplo de visualização fictícia:Informações adicionais
A solução que detecta a diferença nas alterações de layout não funciona muito bem porque depende muito da densidade da tela, pois 100px pode ser muito em um determinado dispositivo e nada em outros pode gerar falso-positivos. Também diferentes fornecedores têm teclados diferentes.
fonte
No Android, você pode detectar através do shell do ADB. Eu escrevi e usei este método:
fonte
fonte
A resposta de @iWantScala é ótima, mas não funcionar para mim
rootView.getRootView().getHeight()
sempre tem o mesmo valorUma maneira é definir dois Vars
adicionar ouvinte global
então verifique
funciona bem
fonte
Finalmente, existe uma maneira direta a partir do Android R, com base no Kotlin agora.
fonte
Eu tive um problema parecido. Eu precisava reagir ao botão Enter na tela (que escondia o teclado). Nesse caso, você pode assinar a OnEditorAction da exibição de texto com a qual o teclado foi aberto - se você tiver várias caixas editáveis, inscreva-se em todas elas.
Na sua Atividade, você tem controle total do teclado; portanto, em nenhum momento você enfrentará o problema de o teclado ser aberto ou não, se você ouvir todos os eventos de abertura e fechamento.
fonte
Existe um método direto para descobrir isso. E, não requer as alterações de layout.
Por isso, também funciona no modo imersivo em tela cheia.
Infelizmente, porém, não funciona em todos os dispositivos. Então você precisa testá-lo com seu (s) dispositivo (s).
O truque é tentar ocultar ou mostrar o teclado virtual e capturar o resultado dessa tentativa.
Se funcionar corretamente, o teclado não será realmente mostrado ou oculto. Nós apenas pedimos o estado.
Para manter-se atualizado, basta repetir esta operação, por exemplo, a cada 200 milissegundos, usando um manipulador.
A implementação abaixo faz apenas uma única verificação.
Se você fizer várias verificações, habilite todos os testes (_keyboardVisible).
fonte
Aqui está uma solução alternativa para saber se o teclado programável está visível.
Alguns dos teclados populares têm determinadas palavras-chave em suas classes
No ActivityManager.RunningServiceInfo, verifique os padrões acima em ClassNames. Além disso, o clientPackage = android do ActivityManager.RunningServiceInfo , indicando que o teclado está vinculado ao sistema.
As informações acima mencionadas podem ser combinadas para uma maneira estrita de descobrir se o teclado virtual está visível.
fonte
Como você deve saber, o teclado do software Android ficará visível apenas quando houver um possível evento de digitação. Em outras palavras, o teclado fica visível apenas quando o EditText está focado. isso significa que você pode ficar sabendo que o teclado está visível ou não usando o OnFocusChangeListener .
Agora você pode usar isKeyBoardVisible variável em qualquer lugar da classe para se o teclado está Aberto ou Não. Isso funcionou bem para mim.
Nota: Esse processo não funciona quando o teclado é aberto programaticamente usando InputMethodManager, porque isso não chama OnFocusChangeListener.
fonte
Eu converti a resposta para o kotlin, espero que isso ajude os usuários do kotlin.
fonte
Ele funciona com o sinalizador AdjustNothing de eventos de atividade e ciclo de vida. Também com Kotlin:
Método útil para manter a visualização sempre acima do teclado
Onde getFullViewBounds
Onde getFullScreenSize
Onde updateMargin
fonte
Fiz isso da seguinte maneira, mas é relevante apenas se o seu objetivo é fechar / abrir o keyboad.
close example: (verificando se o teclado já está fechado, se não - fechando)
fonte
a pode estar usando:
fonte
Eu escrevi amostra .
Este repositório pode ajudar a detectar o status do teclado sem assumir que "o teclado deve ser mais do que X parte da tela"
fonte
Se você suporta apis para AndroidR no seu aplicativo, pode usar o método abaixo.
Nota: Isso está disponível apenas para o AndroidR e, abaixo, a versão do Android precisa seguir algumas das outras respostas, ou eu atualizarei para isso.
fonte