Gostaria de alterar o layout com base no fato de o teclado virtual ser exibido ou não. Pesquisei a API e vários blogs, mas não consigo encontrar nada útil.
É possível?
Obrigado!
android
events
android-softkeyboard
Sander Versluys
fonte
fonte
Respostas:
Nota
Você precisa lidar com as alterações de configuração.
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
Amostra:
Em seguida, basta alterar a visibilidade de algumas visualizações, atualizar um campo e alterar seu arquivo de layout.
fonte
newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO
~ ChrisEsta pode não ser a solução mais eficaz. Mas isso funcionou para mim todas as vezes ... Eu chamo essa função sempre que preciso ouvir o softKeyboard.
Nota: Essa abordagem causará problemas se o usuário usar um teclado flutuante.
fonte
android:windowSoftInputMode="adjustPan"
ouadjustResize
com uma janela de tela cheia, pois o layout nunca é redimensionado.Se você deseja lidar com mostrar / ocultar a janela do teclado IMM (virtual) da sua Atividade, precisará subclassificar seu layout e substituir o método onMesure (para poder determinar a largura medida e a altura medida do seu layout). Depois disso, defina o layout da subclasse como visualização principal da sua Atividade por setContentView (). Agora você poderá lidar com eventos de janela de mostrar / ocultar do IMM. Se isso parece complicado, não é realmente assim. Aqui está o código:
main.xml
Agora, dentro da sua atividade, declare a subclasse do seu layout (main.xml)
Você pode ver no código que inflamos o layout para nossa Activity no construtor de subclasses
E agora apenas defina a exibição do conteúdo do layout subclassificado para nossa Atividade.
fonte
android:windowSoftInputMode="adjustPan"
ouadjustResize
com uma janela de tela cheia, pois o layout nunca é redimensionado.Eu fiz assim:
Adicione
OnKeyboardVisibilityListener
interface.HomeActivity.java :
Espero que isso possa ajudá-lo.
fonte
Com base no código da Nebojsa Tomcic, desenvolvi a seguinte subclasse RelativeLayout:
Isso funciona muito bem ... Observe que esta solução funcionará apenas quando o Modo de entrada suave da sua atividade estiver definido como "WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE"
fonte
android:windowSoftInputMode="adjustPan"
ouadjustResize
com uma janela de tela cheia, pois o layout nunca é redimensionado.Como a resposta de @ amalBit, registre um ouvinte no layout global e calcule a diferença entre o fundo visível do dectorView e o fundo proposto, se a diferença for maior que algum valor (altura do IME), acreditamos que o IME esteja em alta:
o limiar de altura 100 é a altura mínima calculada do IME.
Isso funciona tanto para o AdjustPan quanto para o AdjustResize.
fonte
A solução de Nebojsa quase funcionou para mim. Quando cliquei em um EditText de várias linhas, ele sabia que o teclado era exibido, mas quando comecei a digitar dentro do EditText, o realHeight e o proposHeight ainda eram os mesmos, então não sabia que o teclado ainda era exibido. Fiz uma pequena modificação para armazenar a altura máxima e funciona bem. Aqui está a subclasse revisada:
fonte
Não tenho certeza se alguém postar isso. Achei esta solução simples de usar! . A classe SoftKeyboard está em gist.github.com . Porém, enquanto o teclado pop-up / oculto o retorno de chamada do evento, precisamos de um manipulador para fazer as coisas corretamente na interface do usuário:
fonte
Eu resolvo isso substituindo onKeyPreIme (int keyCode, KeyEvent evento) no meu EditText personalizado.
fonte
Eu tenho uma espécie de truque para fazer isso. Embora não pareça haver uma maneira de detectar quando o teclado virtual é exibido ou oculto, é possível detectar quando ele está prestes a ser exibido ou oculto, definindo um
OnFocusChangeListener
noEditText
que você está ouvindo.NOTA: Uma coisa a ter em atenção com esse hack é que esse retorno de chamada é acionado imediatamente quando o
EditText
ganho ou a perda de foco. Isso realmente dispara antes que o teclado virtual seja exibido ou oculto. A melhor maneira que encontrei para fazer alguma coisa depois que o teclado é exibido ou oculto é usarHandler
ae atrasar algo ~ 400ms, assim:fonte
OnFocusChangeListener
apenas informa se oEditText
foco foi alterado após a alteração do estado. Mas oIME
pode estar oculto quandoEditText
tem foco, como detectar este caso?Sander, acredito que você esteja tentando mostrar a vista bloqueada pelo teclado virtual. Experimente este http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html .
fonte
Eu resolvi o problema na codificação traseira do textview de linha única.
fonte
Você também pode verificar o primeiro preenchimento de fundo filho do DecorView. Será definido como um valor diferente de zero quando o teclado for exibido.
fonte
Ocultar | Mostrar eventos do teclado podem ser ouvidos através de um simples hack no OnGlobalLayoutListener:
Aqui activityRootView é a visualização raiz da sua atividade.
fonte
usando viewTreeObserver para obter facilmente o evento do teclado.
** layout_parent é sua opinião como
edit_text.parent
fonte
A resposta de Nebojsa Tomcic não foi útil para mim. Eu tenho
RelativeLayout
comTextView
eAutoCompleteTextView
dentro dele. Preciso rolarTextView
para baixo quando o teclado é exibido e quando está oculto. Para fazer isso, eu substituí oonLayout
método e funciona bem para mim.fonte