Comment vérifier la visibilité de logiciel clavier Android?
J'ai besoin de faire une chose très simple - savoir si le logiciel clavier est affiché. Est-ce possible dans Android?
- Bien que Ruben Scratton la réponse est bonne, il semble cassé sur une tablette. J'ai remplacé le vérifier diff>128 avec diff>screenHeight/3.
- Ruben Scratton réponse était bonne, mais je KaChi de l'adaptation de l'utiliser effectivement.
- Au lieu de la simple vérification de différence de hauteur, nous pouvons faire
View v = this.getCurrentFocus();if (diff>100 && v != null){ // Its keyboard } else { //Keyboard hidden }
- Vous pouvez essayer cette approche a bien fonctionné pour moi. stackoverflow.com/questions/4745988/...
- merci, cela fonctionne pour moi
- toujours rage à propos de ce en 2018
- J'ai trouvé un moyen de faire ceci: stackoverflow.com/questions/4745988/... (cc @S)
- Pourquoi Google ne font pas un standard builtin méthode fonctionne pour tous les clavier app ?
- Pour ceux qui sont à la recherche d'une réponse, ici, est plus soigné solution: stackoverflow.com/a/54761109/5730321
- Il toujours des frères à moi, que ce n'est pas un système de fonctions...
Vous devez vous connecter pour publier un commentaire.
NOUVELLE RÉPONSE ajouté 25 Jan 2012
Depuis la rédaction de la réponse ci-dessous, quelqu'un de doué-moi pour l'existence de ViewTreeObserver et les amis, les Api qui rôdent dans le SDK depuis la version 1.
Plutôt que d'exiger une Mise en page personnalisée de type, une solution beaucoup plus simple est de donner à votre activité, en vue de la racine connu ID, dire
@+id/activityRoot
, crochet un GlobalLayoutListener dans le ViewTreeObserver, et à partir de là calculer la taille de diff entre votre activité, en vue de la racine et de la taille de la fenêtre:À l'aide d'un utilitaire tel que:
Facile!
Remarque:
Votre application doit définir cette option dans Android Manifeste
android:windowSoftInputMode="adjustResize"
sinon solution ci-dessus ne fonctionnera pas.RÉPONSE ORIGINALE À CETTE QUESTION
Oui c'est possible, mais il est beaucoup plus difficile qu'elle ne devrait l'être.
Si j'ai besoin de s'en soucier lorsque le clavier apparaît et disparaît (ce qui est assez souvent) alors ce que je fais est de personnaliser mon top-niveau classe de mise en page dans un qui remplace
onMeasure()
. La logique de base est que si la mise en page se trouve de remplissage de manière significative moins que la superficie totale de la fenêtre, puis un clavier souple est sans doute montrer.Puis dans votre classe d'Activité...
((ViewGroup) findViewById(android.R.id.content)).getChildAt(0)
android.R.id.content
), vous serez en mesure de dire avec confiance que leSystem
plutôt que votre application est l'entité changer la hauteur. Serait beaucoup plus sûr pour l'Androïde équipe pour nous donner une pause et laissez-nous savoir au moins les choses de base sur la SoftKeyboard d'entrée.heightDiff
toujours à la hauteur de la barre d'action. Dans la nouvelle réponse qui a été ignoré par les essais, si la hauteur est supérieure à la constante, mais 100 pixels n'est pas suffisant pour xxhdpi des dispositifs tels que le Nexus 4. Envisager de convertir cette valeur de DPs si vous voulez vraiment utiliser ce hacky travail.android.widget.LinearLayout cannot be cast to com.sample.Class.LinearLayoutThatDetectsSoftKeyboard
android:windowSoftInputMode="stateHidden|adjustPan"
que j'ai mis dans<application >
partie du fichier de manifeste, fonctionne très bien. Il ne re-taille de mon scrollview donc, je peux faire défiler vers le bas tandis que le clavier est affiché, peut-être une astuce:scrollView.smoothScrollTo(0,70);
pour le faire défiler vers le bas (ou à desY
)GlobalLayoutListener
dont je ne suis pas entièrement dans la connaissance de l'.android:windowSoftInputMode="adjustNothing"
? Merci. J'ai besoin deandroid:windowSoftInputMode
àadjustNothing
.android.R.id.content
dans findViewByIdDonc j'espère que cela aide quelqu'un à sortir.
La nouvelle réponse que Reuben Scratton donné est grand et vraiment efficace, mais il ne fonctionne vraiment que si vous définissez votre windowSoftInputMode à adjustResize. Si vous le réglez à adjustPan, il n'est toujours pas possible de détecter si oui ou non le clavier est visible à l'aide de son extrait de code. Pour contourner ce problème, j'ai fait cette petite modification pour le code ci-dessus.
TwoDScrollerView
similaire à stackoverflow.com/a/5224088/530513 bien qu'avec le zoom trop. L'enfant n'était pas un simpleImageView
mais une mise en page personnalisée (s'étendRelativeLayout
), mais a été incapable de détecter le clavier à l'aide de la solution recommandée malgré la miseandroid:windowSoftInputMode="adjustResize"
. Merci!ActionBar
etActionBarSherlock
. Merci beaucoup! Par ailleurs, il existe une méthoder.height()
🙂heightDiff > root.getRootView().getHeight() / 4
est une bonne valeur pour le travail avec la haute résolution de l'appareil. 100px c'est court. dans Nexus 5 avec 1080x1920 res, 1920 - (996-75) >? 100 = 999 1920 - (1776-75) >? 100 = 219 // clavier est en galaxy s2 avec 480x800 res, 800 - (800-38) >? 100 = 38 800 - (410-38) >? 100 = 428 // clavier est jusqu'alors, le numéro magique 100px n'est pas assez bon.android:windowSoftInputMode="adjustNothing"
? Merci. J'ai besoin deandroid:windowSoftInputMode
àadjustNothing
.Il a été à jamais dans les termes de l'ordinateur, mais cette question est encore incroyablement pertinent!
J'ai donc pris les réponses ci-dessus, et ont combiné et raffiné, un peu...
Fonctionne pour moi 🙂
REMARQUE:
Si vous remarquez que le DefaultKeyboardDP ne convient pas à votre appareil un jeu avec la valeur et de poster un commentaire pour que tout le monde sache ce que devrait être la valeur... finalement, nous allons obtenir la valeur correcte pour s'adapter à tous les appareils!
Pour plus de détails, consultez la mise en œuvre sur Cyborg
activityRootView == null
. Si probablement, vous aurez cette exception, vérifiezif (activityRootView != null) ...
à l'intérieur depublic void onGlobalLayout()
.Désolé pour la réponse tardive, mais j'avais créé une petite classe d'aide à la poignée d'ouverture/fermeture des événements avertir les auditeurs et d'autres choses utiles, peut-être quelqu'un pourrait trouver utile:
Exemple d'utilisation:
getLastKeyboardHeightInPx()
ne comprend pas la hauteur de la ligne. Connaissez-vous un moyen de le prendre en compte?Quelques améliorations pour éviter de détecter à tort la visibilité de clavier souple à haute densité d'appareils:
Seuil de différence de hauteur doit être définie comme 128 dp, pas 128 pixels.
Reportez-vous à Google conception de la doc sur des Métriques et de la Grille, 48 dp est de la bonne taille pour toucher l'objet et 32 dp minimale pour les boutons. Générique soft clavier devrait inclure 4 rangées de touches, donc minimum de la hauteur du clavier doit être: 32 dp * 4 = 128 dp, cela signifie que le seuil de taille devrait transfert de pixels par multiplier dispositif de densité. Pour xxxhdpi périphériques (densité 4), le clavier hauteur de seuil doit être de 128 * 4 = 512 pixels.
Différence de hauteur entre la racine de la vue et de sa zone visible:
vue de la racine de hauteur - barre d'état - hauteur de cadre visible height = vue de la racine de fond - image visible en bas, depuis la barre de statut la hauteur égale à la top de vue de la racine de l'image visible.
J'ai utilisé un peu de temps pour comprendre cela... j'ai couru quelques CastExceptions, mais pensé que vous pouvez remplacer vous LinearLayout dans le layout.xml avec le nom de la classe.
Comme ceci:
De cette façon, vous n'avez pas de cast questions.
... et si vous ne voulez pas le faire sur chaque page, je vous recommande d'utiliser "MasterPage dans Android". Voir le lien ici:
http://jnastase.alner.net/archive/2011/01/08/ldquomaster-pagesrdquo-in-android.aspx
La vérification de la hauteur des éléments n'est pas fiable parce que certains claviers WifiKeyboard ont une hauteur nulle.
Au lieu de cela, vous pouvez utiliser la fonction de rappel suite de showSoftInput() et hideSoftInput() pour vérifier l'état du clavier. Plus de détails et un exemple de code à
https://rogerkeays.com/how-to-check-if-the-software-keyboard-is-shown-in-android
L'idée est que, si vous avez besoin de cacher votre clavier et de vérifier programmable entrée de l'état dans le même temps, utiliser la solution suivante:
Cette méthode retourne true si le clavier a été présenté avant la clandestinité.
Vous pouvez observer softkeyboard de se cacher en utilisant de l'activité decorView.
Au lieu de supposer que la différence de codage j'ai fait quelque chose comme ceci, comme je le force a les options de menu dans mon application.
J'ai trouvé que la combinaison de @Reuben_Scratton de la méthode avec @Yogesh la méthode semble fonctionner le mieux. En combinant leurs méthodes donnerait quelque chose comme ceci:
Il y a aussi la solution avec le système d'encarts, mais il ne fonctionne qu'avec
API >= 21
(Android L
). Disons que vous avezBottomNavigationView
, qui est enfant deLinearLayout
et vous avez besoin de le cacher lorsque le clavier est affiché:Tout ce que vous devez faire est d'étendre
LinearLayout
dans une telle manière:L'idée est que lorsque le clavier est affiché, système d'encarts sont modifiées avec de jolies gros
.bottom
valeur.Il y a de caché méthode peut aider pour cela,
InputMethodManager.getInputMethodWindowVisibleHeight
. Mais je ne sais pas pourquoi il est caché.Aucune de ces solutions fonctionnent pour Sucette comme est. Dans Lollipop
activityRootView.getRootView().getHeight()
comprend la hauteur de la barre de bouton, tout en mesurant le point de vue n'est pas. J'ai adapté le meilleur/la plus simple solution ci-dessus pour travailler avec Lollipop.J'ai utilisé une légère variante de Reuban réponse, qui s'est avérée être plus utile dans certaines circonstances, en particulier grâce à la haute résolution des appareils.
R.id.activityRoot
veuillez me montrer xmlR.id.activityRoot
, vous pouvez simplement utiliserandroid.R.id.content
qui est exactement ce dont vous avez besoin.Il a été à jamais dans les termes de l'ordinateur, mais cette question est encore incroyablement pertinent!
J'ai donc pris les réponses ci-dessus, et ont combiné et raffiné, un peu...
Cela fonctionne pour moi.
Ma réponse est fondamentalement la même que Kachi réponse, mais j'ai enveloppé dans une belle classe d'aide à nettoyer la façon dont il est utilisé tout au long de mon application.
Vous pouvez l'utiliser pour détecter les changements-clavier le clavier n'importe où dans l'application comme ceci:
Remarque: utilisez uniquement l'un des "registre" des appels. Ils travaillent tous les mêmes et ne sont là que pour des raisons de commodité
vous pouvez essayer ce travail formidable pour moi:
J'ai juste rencontré un bug lors de l'utilisation de la plupart des solutions ci-dessus suggèrent que l'ajout d'un nombre fixe.
S4 est doté d'un haut dpi, ce qui a entraîné dans la barre de navigation de la hauteur 100px donc mon application de penser que le clavier est ouvert tout le temps.
Donc, avec tous les nouveaux high res téléphones être publié, je crois, à l'aide d'un codage en dur la valeur n'est pas une bonne idée pour le long terme.
Une meilleure approche que j'ai trouvé après quelques tests sur les différents écrans et les dispositifs a été d'utiliser le pourcentage.
Obtenez la différence entre decorView et ur du contenu de l'application et par la suite de vérifier quel est le pourcentage de cette différence.
De les stats que j'ai eu, plus de la barre de navigation(quelle que soit la taille, la résolution, etc..) va prendre entre 3% à 5% de l'écran. Si le clavier est ouvert, il était de 47% à 55% de l'écran.
En conclusion, ma solution a été de vérifier si l'écart est de plus de 10%, alors je suppose que son clavier ouvert.
J'ai eu de la difficulté à maintenir l'état du clavier lors de la modification de l'orientation des fragments dans un viewpager. Je ne sais pas pourquoi, mais il semble juste être motivé et agit différemment à partir d'un standard d'Activité.
Pour maintenir l'état du clavier, dans ce cas, vous devez d'abord ajouter
android:windowSoftInputMode = "stateUnchanged"
à votreAndroidManifest.xml
. Vous pouvez remarquer, cependant, que cela ne fait pas de résoudre l'ensemble du problème, le clavier ne s'est pas ouvert pour moi si elle a déjà été ouvert avant le changement d'orientation. Dans tous les autres cas, le comportement semblait correcte.Ensuite, nous avons besoin de mettre en œuvre l'une des solutions mentionnées ici.
Le plus propre que j'ai trouvé était George Maisuradze est--utilisez la fonction booléenne de rappel de hideSoftInputFromWindow:
Je stocke cette valeur dans mon Fragment de la
onSaveInstanceState
méthode et extraitonCreate
. Alors, je me force a montré le clavier enonCreateView
si elle avait une valeur detrue
(elle retourne true si le clavier est visible avant de les cacher avant la Fragment de destruction).Essayez ceci:
Voici ma solution, et ça fonctionne. Au lieu de chercher la taille en pixels il suffit de vérifier que la hauteur de l'affichage du contenu a changé ou pas:
De ne pas faire le code. La meilleure façon est que vous devez redimensionner votre point de vue tout à Obtenir l'Accent sur EditText avec KeyBord Spectacle.
Vous pouvez le faire en ajoutant redimensionner propriété sur l'activité dans le Manifeste de fichier à l'aide du code ci-dessous.
android:windowSoftInputMode="adjustResize"
Il y a une méthode directe pour le savoir. Et, il ne nécessite pas de modifications de Mise en page.
Donc, il travaille dans immersive mode plein écran, trop.
Le truc, c'est que vous essayez de cacher ou d'afficher le clavier virtuel et capture le résultat de cet essai.
Pas de panique, ce n'est pas vraiment d'afficher ou de masquer le clavier. Nous vous demandons juste de l'état.
Pour rester à jour, vous pouvez répéter l'opération, par exemple toutes les 200 millisecondes, à l'aide d'un Gestionnaire.
Vous trouverez une mise en œuvre ici: https://stackoverflow.com/a/27567074/2525452
je pense que cette méthode va vous aider à trouver est keybord est visible ou non.
Ruben Scratton nouvelle réponse (calculer le HeightDiff
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
) ne fonctionne pas dans l'activité si vous définissez l'translucide barre d'état en mode.si vous utilisez translucide barre d'état ,
activityRootView.getHeight()
ne changera jamais la météo le clavier est visible. il retournera toujours la hauteur de l'activité et la barre d'état.Par exemple, le Nexus 4, Android 5.0.1, ensemble
android:windowTranslucentStatus
de vrai, ce sera le retour de 1184 à tout jamais, même à l'ime ont ouvert. Si vous définissezandroid:windowTranslucentStatus
à false, il sera de retour en Hauteur correctement, si ime invisible,c'retour 1134(ne pas inclure la barre d'état)。fermez l'éditeur, il sera de retour 5xx peut-être (dépend de l'ime de hauteur)Je ne sais pas la météo c'est un bug, j'ai essayer sur 4.4.4 et 5.0.1, le résultat est le même.
Donc, jusqu'à maintenant, le deuxième plus accepté de répondre, Kachi est la solution la plus sûre façon de calcute la hauteur de l'ime. Voici une copie:
Une méthode qui n'a pas besoin d'un LayoutListener
Dans mon cas, je voudrais enregistrer l'état du clavier avant de remplacer mon Fragment. J'ai appeler la méthode hideSoftInputFromWindow de
onSaveInstanceState
, ce qui ferme le clavier et me renvoie si le clavier est visible ou non.Cette méthode est simple, mais peut modifier l'état de votre clavier.
Je sais que c'est un vieux post, mais je pense que c'est l'approche la plus simple que je connais et mon appareil de test est Nexus 5. Je n'ai pas essayé les autres appareils. Espérons que d'autres viendront partager leur approche, s'ils trouvent que mon code n'est pas bon 🙂
imm.hideSoftInputFromWindow retourne un booléen.
Merci,
La fonction ci-dessus est ce que j'utilise pour vérifier si un Clavier est visible. Si c'est le cas, je le ferme.
Ci-dessous montre les deux méthodes.
D'abord, de définir le réalisable hauteur de la Fenêtre en onCreate.
Ensuite, ajouter un booléen qui obtient la hauteur de la Fenêtre au niveau de cette instance. Si elle ne correspond pas à l'original (en supposant que vous ne modifiez pas le long du chemin...) ensuite, le clavier est ouvert.
Frotz!
Je sais comment vous pouvez déterminer si le clavier est masqué ou non.
Cela fonctionne pour les tablettes. Lorsque navigationbar est indiqué à l'horizontale.
Pense a un moyen facile, comme ceci:
Vous pouvez également voir si lui est active dans une vue spécifique:
De la solution fournie par Ruben Scratton et Kachi semble s'appuyer sur la densité de pixels des appareils, si vous avez une haute densité dispositif de la différence de hauteur peut être plus grand que 100, même avec le clavier vers le bas. Un peu de travail autour de ce serait de voir la première différence de hauteur (avec clavier), puis de comparer avec la différence actuelle.
Voici une solution de contournement pour savoir si softkeyboard est visible.
ActivityManager.getRunningServices(max_count_of_services);
initialement 1, il serait 2 lorsque le clavier est affiché.
Les claviers ont certains mots-clés dans leurs noms de classe:
De ActivityManager.RunningServiceInfo, vérifier ces tendances dans les noms de classe. Aussi, ActivityManager.RunningServiceInfo de clientPackage=android, pour indiquer que le clavier est lié au système.
Les informations mentionnées ci-dessus pourraient être combinées de manière stricte à savoir si le clavier est visible.
Après la compréhension de certains des problèmes avec différentes résolutions, j'ai décidé d'utiliser une taille relative. Comme je l'ai remarqué la différence entre le visible et le caché unis est d'environ 30%. J'ai donc décidé de remplacer 128 PX avec 0,3.
Et j'ai ajouté cette classe écouteur pour aviser de tout changement.
Voici ma version
Ce code fonctionne très agréable
utiliser cette classe pour la vue racine:
}
et choisir le clavier auditeur dans une activité ou un fragment:
Peut-être que ce sera vous aider à:
99% de solutions ici sont basés sur la probabilité de l'IME la TAILLE de la FENÊTRE et chaque solution est un poisson... vaut!
parce que:
donc deviner qu'il IME est toujours à tort - ne sait pas en être sûr !!!
@kevin-du est la meilleure solution wright maintenant que sa requête IMM pour IME en hauteur, mais comme il dit que la méthode est caché API afin de l'utiliser peut être dangereux dans la façon d'obtenir faux "faux négatifs" - par le mauvais dev d'utilisation.
Se référant à cette réponse par @TacB0sS j'ai développé une classe de Kotlin. Espérons que ce sera utile. Laissez-moi savoir si cela nécessite un peu d'amélioration.
Cette solution peut ré-ouvre le clavier, mais il fonctionne.
La InputMethodManager dispose d'informations sur le clavier virtuel. Vous l'obtenir à partir d'une activité par l'intermédiaire de:
Vous pouvez jouer avec ça pour voir ce qu'il peut vous le dire. Vous pouvez l'utiliser pour afficher ou masquer le soft d'entrée...