Eu tenho um Activity
onde existem 5 EditText
s. Quando o usuário clica no primeiro EditText
, o teclado virtual é aberto para inserir algum valor nele. Desejo definir View
a visibilidade de outras pessoas para Gone
quando o teclado virtual abrir e também quando o usuário clicar no primeiro EditText
e também quando o teclado virtual fechar da mesma EditText
no botão Voltar. Quero definir View
a visibilidade de outra pessoa como visível.
Existe algum ouvinte ou retorno de chamada ou hack para quando o teclado virtual é aberto a partir de um clique no primeiro EditText
no Android?
trying to detect the virtual keyboard height in Android.
X
e o ponteiro estiveremY
sobre / sobre o teclado =>SecurityException
=> decrementoY
e tente novamente => até que nenhuma exceção seja lançada => OY
valor atual é a altura do teclado. 2. se o teclado não estiver aberto => nãoSecurityException
.SecurityException
é acionado => o teclado está aberto. Senão, o teclado está fechado.EditText
não outroEditText
. Como posso distinguir isso?Respostas:
Isso funciona apenas quando
android:windowSoftInputMode
sua atividade está definidaadjustResize
no manifesto. Você pode usar um ouvinte de layout para ver se o layout raiz da sua atividade é redimensionado pelo teclado.Uso algo como a seguinte classe base para minhas atividades:
O exemplo de atividade a seguir usa isso para ocultar uma exibição quando o teclado é mostrado e mostrá-la novamente quando o teclado está oculto.
O layout xml:
E a atividade:
fonte
rootLayout = (ViewGroup) findViewById(R.id.rootLayout);
vem?Pedaço de bolo com a incrível biblioteca KeyboardVisibilityEvent
Créditos para Yasuhiro SHIMIZU
fonte
Como Vikram apontou nos comentários, detectar se o teclado virtual é exibido ou desapareceu só é possível com alguns hacks feios.
Talvez seja suficiente definir um ouvinte de foco no edittext :
fonte
setOnFocusChangeListener
ouvinte será chamado, pressione novamente e feche o teclado, mas não cliquei em outras visualizações. Agora, novamente, clico no mesmo edittext que já tem foco e o que acontecerá?onFocusChange()
não será chamado.Para atividade:
Para Fragmento:
fonte
android:windowSoftInputMode="adjustResize"
manifesto?A resposta de Jaap não funcionará para AppCompatActivity. Em vez disso, obtenha a altura da barra de status e da barra de navegação etc. e compare com o tamanho da janela do seu aplicativo.
Igual a:
fonte
Você pode experimentá-lo:
fonte
Você pode usar minha função de extensão Rx (Kotlin).
Exemplo:
fonte
dip()
egetScreenHeight()
O código abaixo está funcionando para mim,
fonte
Se possível, tente estender o EditText e substituir o método 'onKeyPreIme'.
Como você pode estendê-lo:
Eu acho que esse recálculo da altura da tela não é 100% bem-sucedido, como mencionado anteriormente. Para ser claro, a substituição do 'onKeyPreIme' não é chamada nos métodos 'ocultar teclado programático', MAS se você estiver fazendo isso em qualquer lugar, deve fazer a lógica 'onKeyboardHidden' lá e não criar soluções abrangentes.
fonte
fonte
setOnFocusChangeListener
ouvinte será chamado, pressione novamente e feche o teclado, mas não cliquei em outras visualizações. Agora, novamente, clico no mesmo edittext que já tem foco e o que acontecerá?onfocus
ouvinte nunca chamam isso de é que eu estou procurando não o que você está sugerindoUse esta classe,
Em
Android Manifest
,android:windowSoftInputMode="adjustResize"
é necessário.PS - completamente retirado daqui .
fonte
Para o caso de
adjustResize
FragmentActivity, a solução aceita do @Jaap não funciona para mim.Aqui está a minha solução:
fonte
Uma abordagem diferente seria verificar quando o usuário parou de digitar ...
Quando um TextEdit está em foco (o usuário está / estava digitando), você pode ocultar as visualizações (ouvinte do foco)
e use um manipulador + executável e um ouvinte de alteração de texto para fechar o teclado (independentemente de sua visibilidade) e mostrar as visualizações após algum atraso.
O principal aspecto a ser observado é o atraso que você usa, que depende do conteúdo desses TextEdits.
fonte
Esse código funciona muito bem
use esta classe para a visualização raiz:
}
e defina o ouvinte do teclado em atividade ou fragmento:
fonte
Você pode lidar com a visibilidade do teclado substituindo dois métodos em sua Atividade:
onKeyUp()
eonKeyDown()
mais informações neste link: https://developer.android.com/training/keyboard-input/commandsfonte
Infelizmente, não tenho uma reputação suficientemente alta para comentar a resposta de Jaap van Hengstum. Mas li alguns comentários de pessoas, tendo o problema que
contentViewTop
é sempre0
e queonShowKeyboard(...)
é sempre chamado.Eu tive o mesmo problema e descobri o problema que eu tinha. Eu usei um em
AppCompatActivity
vez de um 'normal'Activity
. Nesse caso,Window.ID_ANDROID_CONTENT
refere-se a um valorContentFrameLayout
e não aoFrameLayout
valor superior correto. No meu caso, foi bom usar o 'normal'Activity
; se você tiver que usar outro tipo de atividade (acabei de testar oAppCompatActivity
, talvez também seja um problema com outros tipos de atividade como oFragmentActivity
), é necessário acessar oFrameLayout
, que é um ancestral doContentFrameLayout
.fonte
quando o teclado mostra
é verdade, senão esconda
fonte
Eu modifiquei a resposta aceita do Jaap um pouco. Mas no meu caso, existem poucas suposições, como
android:windowSoftInputMode=adjustResize
o teclado não aparece no início quando o aplicativo é iniciado. E também, presumo que a tela em relação à altura dos pais.contentHeight > 0
essa verificação fornece-me para saber se a tela relacionada está oculta ou é mostrada para aplicar a escuta de eventos do teclado para essa tela específica. Também passo a visualização de layout da tela referente no métodoattachKeyboardListeners(<your layout view here>)
da minha atividade principalonCreate()
. Sempre que a altura da tela em questão é alterada, eu a salvo emprevContentHeight
variável para verificar posteriormente se o teclado é mostrado ou oculto.Para mim, até agora tem sido bem trabalhado. Espero que funcione para os outros também.
fonte
A resposta de "Jaap van Hengstum" está funcionando para mim, mas não há necessidade de definir "android: windowSoftInputMode" como ele acabou de dizer!
Eu o reduzi (agora apenas detecta o que quero, na verdade, um evento ao mostrar e ocultar o teclado):
e não se esqueça de adicionar isso
fonte
Isso funcionará sem a necessidade de alterar as configurações de sua atividade.
android:windowSoftInputMode
etapa 1: estenda a classe EditText e substitua estas duas:
etapa 2: crie esses dois em sua atividade:
*** lembre-se, a fim de fazer o
clearFocus
trabalho, você deve tornar o pai ou o primeiro filho na hierarquia dos pais focalizável.fonte
Isso não está funcionando como desejado ...
... vi muitos usarem cálculos de tamanho para verificar ...
Eu queria determinar se estava aberto ou não e achei
isAcceptingText()
portanto, isso realmente não responde à pergunta, pois não trata de abrir ou fechar, mais ou menos como está aberto ou fechado; portanto, é um código relacionado que pode ajudar outras pessoas em vários cenários ...
em uma atividade
em um fragmento
fonte
verifique com o código abaixo:
CÓDIGO XML:
CÓDIGO JAVA:
fonte