Existe-t-il un moyen dans Android de détecter si le clavier du logiciel (aka "soft") est visible à l'écran?
android
keyboard
android-softkeyboard
andreea
la source
la source
Réponses:
Il n'y a pas de moyen direct - voir http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a où Dianne Hackborn de l'équipe Android a répondu. Cependant, vous pouvez le détecter indirectement en vérifiant si la taille de la fenêtre a changé dans #onMeasure. Voir Comment vérifier la visibilité du clavier logiciel dans Android? .
la source
Cela fonctionne pour moi. C'est peut-être toujours le meilleur moyen pour toutes les versions .
Il serait efficace de faire une propriété de visibilité du clavier et d'observer ces changements différés car la méthode onGlobalLayout appelle plusieurs fois. Il est également bon de vérifier la rotation de l'appareil et ce
windowSoftInputMode
n'est pas le casadjustNothing
.la source
contentView
déclaré?essaye ça:
la source
J'ai créé une classe simple qui peut être utilisée pour cela: https://github.com/ravindu1024/android-keyboardlistener . Copiez-le simplement dans votre projet et utilisez-le comme suit:
la source
Très facile
1. Mettez id sur votre vue racine
rootView
est juste une vue pointant vers ma vue racine dans ce casrelative layout
:2. Initialisez votre vue racine dans votre activité:
RelativeLayout rootView = (RelativeLayout) findViewById(R.id.addresses_confirm_root_view);
3. Détectez si le clavier est ouvert ou fermé en utilisant
getViewTreeObserver()
la source
1
. Peu importe. Seulement cela doit être inférieur à la longueur réelle du clavierJ'ai utilisé cela comme base: http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
A ensuite écrit cette méthode:
Vous pouvez ensuite l'utiliser pour tester tous les champs (EditText, AutoCompleteTextView, etc.) qui peuvent avoir ouvert un clavier logiciel:
Ce n'est certes pas une solution idéale, mais elle fait le travail.
la source
Vous pouvez utiliser le résultat du rappel de showSoftInput () et hideSoftInput () pour vérifier l'état du clavier. Détails complets et exemple de code sur
http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
la source
Vous pouvez vous référer à cette réponse - https://stackoverflow.com/a/24105062/3629912
Cela a fonctionné pour moi à chaque fois.
Il retournera vrai, si le clavier du logiciel est visible.
la source
Donc, après avoir longtemps joué avec AccessibilityServices, les encarts de fenêtre, la détection de la hauteur de l'écran, etc., je pense avoir trouvé un moyen de le faire.
Avertissement: il utilise une méthode cachée dans Android, ce qui signifie qu'il pourrait ne pas être cohérent. Cependant, dans mes tests, cela semble fonctionner.
La méthode est InputMethodManager # getInputMethodWindowVisibleHeight () , et elle existe depuis Lollipop (5.0).
Appel qui renvoie la hauteur, en pixels, du clavier actuel. En théorie, un clavier ne devrait pas mesurer 0 pixels de hauteur, j'ai donc fait une simple vérification de la hauteur (dans Kotlin):
J'utilise Android Hidden API pour éviter la réflexion lorsque j'appelle des méthodes cachées (je le fais souvent pour les applications que je développe, qui sont principalement des applications de piratage / tuner), mais cela devrait être possible avec la réflexion également:
la source
C'était beaucoup moins compliqué pour les exigences dont j'avais besoin. J'espère que cela pourrait aider:
Sur l'activité principale:
La valeur booléenne primitive par défaut pour mKeyboardStatus sera initialisée à false .
Vérifiez ensuite la valeur comme suit et effectuez une action si nécessaire:
la source
Cela devrait fonctionner si vous devez vérifier l'état du clavier:
Où
UiUtils.KEYBOARD_VISIBLE_THRESHOLD_DP
= 100 et dip () est une fonction anko qui convertit dpToPx:la source
J'ai fait cela en définissant un GlobalLayoutListener, comme suit:
la source
Essayez ce code, cela fonctionne vraiment si KeyboardShown est affiché, alors cette fonction retourne la vraie valeur ....
la source
Dans mon cas, je n'avais qu'un seul
EditText
à gérer dans ma mise en page, donc j'ai trouvé cette solution. Cela fonctionne bien, fondamentalement, c'est une coutumeEditText
qui écoute le focus et envoie une diffusion locale si le focus change ou si le bouton retour / terminé est enfoncé. Pour travailler, vous devez placer un mannequinView
dans votre mise en page avecandroid:focusable="true"
etandroid:focusableInTouchMode="true"
parce que lorsque vous appelezclearFocus()
le focus sera réaffecté à la première vue focusable. Exemple de vue fictive:Infos supplémentaires
La solution qui détecte la différence dans les changements de disposition ne fonctionne pas très bien car elle dépend fortement de la densité de l'écran, car 100px peut être beaucoup dans un certain appareil et rien dans certains autres, vous pourriez obtenir de faux positifs. Différents fournisseurs ont également différents claviers.
la source
Dans Android, vous pouvez détecter via le shell ADB. J'ai écrit et utilisé cette méthode:
la source
la source
La réponse de @iWantScala est excellente mais ne fonctionne pas pour moi a
rootView.getRootView().getHeight()
toujours la même valeurune façon consiste à définir deux vars
ajouter un écouteur global
puis vérifier
fonctionne bien
la source
Il existe enfin un moyen direct à partir d'Android R basé sur Kotlin maintenant.
la source
J'avais un problème similaire. J'avais besoin de réagir au bouton Entrée à l'écran (qui cachait le clavier). Dans ce cas, vous pouvez vous abonner à l'action OnEditorAction de la vue texte avec laquelle le clavier était ouvert - si vous avez plusieurs boîtes modifiables, alors abonnez-vous à toutes.
Dans votre activité, vous avez le contrôle total du clavier, donc à aucun moment vous ne serez confronté au problème que le clavier soit ouvert ou non, si vous écoutez tous les événements d'ouverture et de fermeture.
la source
Il existe une méthode directe pour le savoir. Et, il ne nécessite pas de modifications de mise en page.
Cela fonctionne donc également en mode plein écran immersif.
Mais, malheureusement, cela ne fonctionne pas sur tous les appareils. Vous devez donc le tester avec votre ou vos appareils.
L'astuce est que vous essayez de masquer ou d'afficher le clavier virtuel et de capturer le résultat de cet essai.
Si cela fonctionne correctement, le clavier n'est pas vraiment affiché ou caché. Nous demandons simplement l'État.
Pour rester à jour, il vous suffit de répéter cette opération, par exemple toutes les 200 millisecondes, à l'aide d'un gestionnaire.
L'implémentation ci-dessous ne fait qu'une seule vérification.
Si vous effectuez plusieurs vérifications, vous devez activer tous les tests (_keyboardVisible).
la source
Voici une solution de contournement pour savoir si le clavier logiciel est visible.
Certains claviers populaires ont certains mots-clés dans leurs classNames:
Dans ActivityManager.RunningServiceInfo, recherchez les modèles ci-dessus dans ClassNames. En outre, clientPackage = android , ActivityManager.RunningServiceInfo , indiquant que le clavier est lié au système.
Les informations mentionnées ci-dessus pourraient être combinées pour une manière stricte de savoir si le clavier logiciel est visible.
la source
Comme vous le savez peut-être, le clavier du logiciel Android ne sera visible que s'il y a un événement possible de frappe. En d'autres termes, le clavier n'est visible que lorsque EditText est focalisé. cela signifie que vous pouvez obtenir la météo du clavier est visible ou non en utilisant OnFocusChangeListener .
Vous pouvez maintenant utiliser la variable isKeyBoardVisible n'importe où dans la classe pour obtenir la météo lorsque le clavier est ouvert ou non. Ça a bien marché pour moi.
Remarque: ce processus ne fonctionne pas lorsque le clavier est ouvert par programmation à l'aide de InputMethodManager car cela n'invoque pas OnFocusChangeListener.
la source
J'ai converti la réponse en kotlin, j'espère que cela aide les utilisateurs de kotlin.
la source
Il fonctionne avec adjustNothing, le drapeau d'activité et les événements de cycle de vie sont utilisés. Aussi avec Kotlin:
Méthode utile pour garder la vue toujours au-dessus du clavier
Où getFullViewBounds
Où getFullScreenSize
Où updateMargin
la source
Je l'ai fait comme suit, mais sa pertinence n'est que si votre objectif est de fermer / ouvrir le clavier.
exemple de fermeture: (vérification si le clavier est déjà fermé, sinon - fermeture)
la source
un peut utiliser:
la source
J'ai écrit un échantillon .
Ce référentiel peut aider à détecter l'état du clavier sans supposer que "le clavier doit faire plus de X parties de l'écran"
la source
Si vous prenez en charge les API pour AndroidR dans votre application, vous pouvez utiliser la méthode ci-dessous.
Remarque: Ceci n'est disponible que pour AndroidR et la version Android ci-dessous doit suivre une autre réponse ou je la mettrai à jour pour cela.
la source