Comment faire pour capturer le “clavier virtuel " afficher/masquer” l'événement dans Android?
Je voudrais modifier la mise en page selon que le clavier virtuel est affiché ou non. J'ai cherché l'API et les différents blogs mais n'arrive pas à trouver quelque chose d'utile.
Est-il possible?
Merci!
- double possible de Android EditText, clavier souple afficher/masquer le cas?
Vous devez vous connecter pour publier un commentaire.
Vous avez à gérer les changements de configuration vous-même.
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
Exemple:
Alors il suffit de changer la visibilité de certains points de vue, mettre à jour un champ, et de modifier votre fichier de mise en page.
Note
Cette solution ne fonctionne pas pour les claviers virtuels et
onConfigurationChanged
ne sera pas appelé pour les claviers virtuels.newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO
~Chrisandroid:configChanges="orientation|keyboardHidden"
dansAndroidManifest.xml
etonConfigurationChanged()
en effet ne pas me faire virer. C'est au sein deandroid.support.v7.app.ActionBarActivity
onConfigurationChanged()
n'est pas même être appelé sur softkeyboard lancement.Cela peut ne pas être la solution la plus efficace. Mais cela a fonctionné pour moi à chaque fois... j'ai appeler cette fonction si jamais j'ai besoin d'écouter de la softKeyboard.
Note:
Cette approche pourra causer des problèmes si l'utilisateur utilise un clavier flottant.
android:windowSoftInputMode="adjustPan"
, ouadjustResize
avec une fenêtre plein écran, comme la mise en page n'est jamais redimensionnée.Si vous souhaitez gérer afficher/masquer de l'IMM (virtuel) du clavier de la fenêtre de votre Activité, vous aurez besoin d'une classe de votre mise en page et remplacer onMesure méthode(de sorte que vous pouvez déterminer la largeur et la hauteur mesurée de votre mise en page). Après cet ensemble de sous-classé disposition comme écran principal de votre Activité par setContentView(). Maintenant, vous serez capable de gérer IMM afficher/masquer la fenêtre événements. Si cela vous semble compliqué, il n'en est pas vraiment. Voici le code:
main.xml
Maintenant à l'intérieur de votre Activité de déclarer la sous-classe pour votre mise en page (main.xml)
Vous pouvez le voir dans le code que nous gonfler mise en page pour notre Activité de constructeur de sous-classe
Et maintenant définir l'affichage du contenu de la sous-classé à la disposition de notre Activité.
android:windowSoftInputMode="adjustPan"
, ouadjustResize
avec une fenêtre plein écran, comme la mise en page n'est jamais redimensionnée.J'ai fait de cette façon:
Ajouter
OnKeyboardVisibilityListener
interface.HomeActivity.java:
Espère que cela peut vous aider.
Sur la base du Code de Nebojsa Tomcic j'ai mis au point la suite de RelativeLayout-sous-classe:
Cela fonctionne très bien...
Marque, que cette solution tout fonctionne lorsque Mous Mode d'Entrée de votre Activité est réglé sur "WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE"
android:windowSoftInputMode="adjustPan"
, ouadjustResize
avec une fenêtre plein écran, comme la mise en page n'est jamais redimensionnée.Comme @amalBit réponse, enregistrer un écouteur à la mise en page globale et calculer la différence de dectorView visible du bas et son projet de fond, si la différence est plus grande que la valeur(deviné IME de hauteur), nous pensons IME est:
la hauteur du seuil de 100 deviné hauteur minimale de l'IME.
Cela fonctionne pour les deux adjustPan et adjustResize.
Nebojsa la solution a presque fonctionné pour moi. Quand j'ai cliqué à l'intérieur d'un multi-ligne EditText il savait que le clavier est affiché, mais quand j'ai commencé à taper à l'intérieur de l'EditText, le actualHeight et proposedHeight étaient toujours les mêmes, de sorte qu'il ne savent pas qu'ils le clavier est toujours affiché. J'ai fait une légère modification pour stocker un max de hauteur et il fonctionne très bien. Voici la version révisée de la sous-classe:
Je résoudre ce problème en substituant onKeyPreIme(int keyCode, KeyEvent event) dans mon custom EditText.
Ne sais pas si quelqu'un post ce. Trouvé cette solution simple à utiliser!. Le SoftKeyboard classe est sur gist.github.com. Mais alors que le clavier popup/masquer de rappel d'événement nous avons besoin d'un gestionnaire de bien faire les choses sur l'INTERFACE utilisateur:
J'ai une sorte de hack pour ce faire. Bien qu'il ne semble pas être un moyen de détecter lorsque le clavier virtuel est affiché ou caché, vous peut en fait détecter quand il est sur être affichés ou masqués par la fixation d'un
OnFocusChangeListener
sur leEditText
que vous êtes en train d'écouter.REMARQUE: Une chose à être conscients de avec ce hack, c'est que cette fonction de rappel est déclenché immédiatement lorsque le
EditText
gagne ou perd le focus. Ce sera effectivement le feu juste avant le clavier affiche ou masque. Le meilleur moyen que j'ai trouvé à faire quelque chose de après le clavier affiche ou masque est d'utiliser unHandler
et de retarder quelque chose de ~ 400ms, comme suit:OnFocusChangeListener
dit seulement queEditText
a le focus après que l'état a changé. Mais leIME
peut être caché lorsqu'EditText
a le focus, comment détecter ce cas?Sander ,je crois que vous essayez de montrer le point de vue bloquée par le clavier. Essayez cette http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html.
J'ai de résoudre le problème sur une seule ligne textview retour de codage.
Vous pouvez également vérifier pour la première DecorView de l'enfant en bas du rembourrage. Il sera mis en valeur non nulle lorsque le clavier est affiché.
Masquer|Afficher les événements de clavier peut être écouté par simple hack dans OnGlobalLayoutListener :
Ici activityRootView est votre Activité, en vue de la racine.
Nebojsa Tomcic la réponse n'était pas utile pour moi. J'ai
RelativeLayout
avecTextView
etAutoCompleteTextView
à l'intérieur. J'ai besoin de faire défiler laTextView
vers le bas lorsque le clavier est montré et quand il est caché. Pour accomplir cela, j'ai remplacéonLayout
méthode et ça fonctionne très bien pour moi.