J'ai un EditText
et un Button
dans ma mise en page.
Après avoir écrit dans le champ d'édition et cliqué sur Button
, je souhaite masquer le clavier virtuel. Je suppose qu'il s'agit d'un simple morceau de code, mais où puis-je en trouver un exemple?
Lorsque vous touchez à l'extérieur du clavier.
Réponses:
Pour aider à clarifier cette folie, je voudrais commencer par m'excuser au nom de tous les utilisateurs d'Android du traitement carrément ridicule de Google pour le clavier logiciel. La raison pour laquelle il y a tant de réponses, chacune différente, pour la même question simple est que cette API, comme beaucoup d'autres dans Android, est horriblement conçue. Je ne peux penser à aucune manière polie de le dire.
Je veux cacher le clavier. Je pense à fournir Android avec l'énoncé suivant:
Keyboard.hide()
. La fin. Merci beaucoup. Mais Android a un problème. Vous devez utiliser leInputMethodManager
pour masquer le clavier. D'accord, c'est l'API d'Android pour le clavier. MAIS! Vous devez en avoir unContext
pour avoir accès à l'IMM. Maintenant, nous avons un problème. Je peux vouloir cacher le clavier d'une classe statique ou utilitaire qui n'a aucune utilité ou besoin d'aucuneContext
. ou bien pire, IMM demande que vous spécifiiez de quoiView
(ou pire encore, de quoiWindow
) vous voulez cacher le clavier.C'est ce qui rend le masquage du clavier si difficile. Cher Google: Quand je recherche la recette d'un gâteau, il n'y a personne
RecipeProvider
sur Terre qui refuserait de me fournir la recette à moins que je ne réponde d'abord QUI le gâteau sera mangé par ET où il sera mangé !!Cette triste histoire se termine par la vilaine vérité: pour cacher le clavier Android, vous devrez fournir 2 formes d'identification: a
Context
et soit aView
soit aWindow
.J'ai créé une méthode utilitaire statique qui peut faire le travail TRÈS solidement, à condition de l'appeler à partir d'un
Activity
.Sachez que cette méthode utilitaire fonctionne UNIQUEMENT lorsqu'elle est appelée à partir d'un
Activity
! La méthode ci-dessus appellegetCurrentFocus
la cibleActivity
pour récupérer le jeton de fenêtre approprié.Mais supposons que vous vouliez cacher le clavier d'un
EditText
hébergé dans unDialogFragment
? Vous ne pouvez pas utiliser la méthode ci-dessus pour cela:Cela ne fonctionnera pas car vous passerez une référence à l'
Fragment
hôte deActivity
, qui n'aura aucun contrôle concentré pendant que leFragment
est affiché! Hou la la! Donc, pour cacher le clavier des fragments, je recourt au niveau inférieur, plus courant et plus laid:Vous trouverez ci-dessous quelques informations supplémentaires tirées du temps perdu à courir après cette solution:
À propos de windowSoftInputMode
Il y a encore un autre point de discorde à prendre en compte. Par défaut, Android attribuera automatiquement la mise au point initiale au premier
EditText
ou au contrôle pouvant être mis au point dans votreActivity
. Il s'ensuit naturellement que InputMethod (généralement le clavier virtuel) répondra à l'événement de focus en se montrant. L'windowSoftInputMode
attribut dansAndroidManifest.xml
, lorsqu'il est défini surstateAlwaysHidden
, demande au clavier d'ignorer ce focus initial attribué automatiquement.Presque incroyablement, il ne semble rien faire pour empêcher le clavier de s'ouvrir lorsque vous touchez le contrôle (sauf si
focusable="false"
et / oufocusableInTouchMode="false"
sont assignés au contrôle). Apparemment, le paramètre windowSoftInputMode s'applique uniquement aux événements de focus automatique, pas aux événements de focus déclenchés par des événements tactiles.Par conséquent,
stateAlwaysHidden
est TRÈS mal nommé en effet. Il faudrait peut-être l'appeler à laignoreInitialFocus
place.J'espère que cela t'aides.
MISE À JOUR: Plus de façons d'obtenir un jeton de fenêtre
S'il n'y a pas de vue ciblée (par exemple, si vous venez de changer des fragments), il existe d'autres vues qui fourniront un jeton de fenêtre utile.
Ce sont des alternatives pour le code
if (view == null) view = new View(activity);
ci- dessus. Elles ne se réfèrent pas explicitement à votre activité.Dans une classe de fragments:
Étant donné un fragment
fragment
comme paramètre:À partir de votre corps de contenu:
MISE À JOUR 2: Effacer la mise au point pour éviter d'afficher à nouveau le clavier si vous ouvrez l'application en arrière-plan
Ajoutez cette ligne à la fin de la méthode:
view.clearFocus();
la source
Fragment
il semble que vous pouvez utilisergetActivity().getWindow().getDecorView()
Keyboard.hide();
utilitaireVous pouvez forcer Android à masquer le clavier virtuel en utilisant InputMethodManager , en appelant
hideSoftInputFromWindow
, en passant le jeton de la fenêtre contenant votre vue focalisée.Cela forcera le clavier à être caché dans toutes les situations. Dans certains cas, vous voudrez passer en
InputMethodManager.HIDE_IMPLICIT_ONLY
tant que second paramètre pour vous assurer de ne masquer le clavier que lorsque l'utilisateur ne l'a pas forcé à apparaître (en maintenant le menu enfoncé).Remarque: Si vous souhaitez le faire dans Kotlin, utilisez:
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
Syntaxe de Kotlin
la source
editText.clearFocus()
alorsInputMethodManager.HIDE_IMPLICIT_ONLY
même4.1
View focused = getCurrentFocus()
pour obtenir ce qui est définitivement la vue actuellement focalisée, l'appelfocused.clearFocus()
, puisinputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)
(avec des indicateurs clairs).Également utile pour masquer le clavier virtuel:
Cela peut être utilisé pour supprimer le clavier logiciel jusqu'à ce que l'utilisateur touche réellement la vue editText.
la source
J'ai une autre solution pour masquer le clavier:
Ici, passez
HIDE_IMPLICIT_ONLY
à la positionshowFlag
et0
à la position dehiddenFlag
. Il fermera de force le clavier logiciel.la source
La solution de Meier fonctionne aussi pour moi. Dans mon cas, le niveau supérieur de mon application est un tabHost et je veux masquer le mot-clé lorsque je change d'onglet - j'obtiens le jeton de fenêtre de la vue tabHost.
la source
Veuillez essayer ce code ci-dessous dans
onCreate()
la source
editView.setInputType(InputType.TYPE_NULL);
Mise à jour: je ne sais plus pourquoi cette solution ne fonctionne plus (je viens de tester sur Android 23). Veuillez utiliser à la place la solution de Saurabh Pareek . C'est ici:
Ancienne réponse:
la source
I don't know why this solution is not work any more
- parce que c'est Android , tout va pouvoir changer, peut-être en partie de mauvais design ... On écrit négligemment, puis on raye tout et on réécrit tout.la source
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
.input.setInputType(0);
ce code. Il a changé un comportement de clavier etinputType
pour leEditText
.Si toutes les autres réponses ici ne fonctionnent pas pour vous comme vous le souhaitez, il existe un autre moyen de contrôler manuellement le clavier.
Créez une fonction qui gérera certaines des
EditText
propriétés de:Ensuite, assurez-vous que l'onFocus du
EditText
vous ouvrez / fermez le clavier:Maintenant, chaque fois que vous souhaitez ouvrir le clavier manuellement, appelez:
Et pour clôturer l'appel:
la source
Saurabh Pareek a jusqu'à présent la meilleure réponse.
Pourrait aussi bien utiliser les bons drapeaux.
Exemple d'utilisation réelle
la source
fragment.getActivity().getSystemService();
de tant de recherche, ici j'ai trouvé une réponse qui fonctionne pour moi
la source
La réponse courte
Dans votre
OnClick
auditeur, appelez leonEditorAction
desEditText
avecIME_ACTION_DONE
Le drill-down
Je pense que cette méthode est meilleure, plus simple et plus alignée avec le modèle de conception d'Android. Dans l'exemple simple ci-dessus (et généralement dans la plupart des cas courants), vous aurez un
EditText
qui a / avait le focus et c'est aussi généralement celui qui invoque le clavier en premier lieu (il est certainement capable de l'invoquer dans de nombreux scénarios courants). De la même manière, ce devrait être celui qui relâche le clavier, ce qui peut généralement être fait par unImeAction
. Il suffit de voir comment se comporte unEditText
avecandroid:imeOptions="actionDone"
, vous voulez obtenir le même comportement par les mêmes moyens.Vérifiez cette réponse connexe
la source
Cela devrait fonctionner:
la source
hide()
et lesshow()
méthodes pour avoir plus de contrôle sur le moment où elle doit s'afficher et quand elle ne le doit pas. Fonctionne pour moi, je l'ai fait aussi :) Je vais éditer l'exempleKeyBoard.toggle(fragment.getActivity())
Fragment
, comme un commenté. Apprenez à utiliser les méthodes, puis revenez. Vous confondez les gens avec vos réponses stupidesJ'utilise un clavier personnalisé pour saisir un numéro Hex donc je ne peux pas faire apparaître le clavier IMM ...
Dans la v3.2.4_r1 a
setSoftInputShownOnFocus(boolean show)
été ajouté pour contrôler la météo ou pour ne pas afficher le clavier lorsqu'un TextView obtient le focus, mais son toujours caché, donc la réflexion doit être utilisée:Pour les versions plus anciennes, j'ai obtenu de très bons résultats (mais loin d'être parfaits) avec un
OnGlobalLayoutListener
, ajouté à l'aide d'un àViewTreeObserver
partir de ma vue racine, puis en vérifiant si le clavier est affiché comme ceci:Cette dernière solution peut afficher le clavier pendant une fraction de seconde et perturbe les poignées de sélection.
Lorsque le clavier entre en plein écran, onGlobalLayout n'est pas appelé. Pour éviter cela, utilisez TextView # setImeOptions (int) ou dans la déclaration XML TextView:
Mise à jour: vient de trouver ce que les boîtes de dialogue utilisent pour ne jamais afficher le clavier et fonctionne dans toutes les versions:
la source
la source
J'ai passé plus de deux jours à travailler sur toutes les solutions publiées dans le fil et je les ai trouvées manquantes d'une manière ou d'une autre. Mon exigence exacte est d'avoir un bouton qui, avec une fiabilité à 100%, affichera ou masquera le clavier à l'écran. Lorsque le clavier est dans son état masqué, il ne doit pas réapparaître, quels que soient les champs de saisie sur lesquels l'utilisateur clique. Lorsqu'il est dans son état visible, le clavier ne doit pas disparaître, quels que soient les boutons sur lesquels l'utilisateur clique. Cela doit fonctionner sur Android 2.2+ jusqu'aux derniers appareils.
Vous pouvez voir une implémentation fonctionnelle de cela dans mon application RPN propre .
Après avoir testé de nombreuses réponses suggérées sur un certain nombre de téléphones différents (y compris les appareils Froyo et Gingerbread), il est devenu évident que les applications Android peuvent de manière fiable:
Pour moi, masquer temporairement le clavier ne suffit pas. Sur certains appareils, il réapparaîtra dès qu'un nouveau champ de texte sera mis au point. Comme mon application utilise plusieurs champs de texte sur une seule page, la mise au point d'un nouveau champ de texte fera réapparaître le clavier masqué.
Malheureusement, les éléments 2 et 3 de la liste ne fonctionnent que lorsque la fiabilité d'une activité est démarrée. Une fois que l'activité est devenue visible, vous ne pouvez plus masquer ou afficher le clavier de façon permanente. L'astuce consiste à redémarrer réellement votre activité lorsque l'utilisateur appuie sur le bouton à bascule du clavier. Dans mon application, lorsque l'utilisateur appuie sur le bouton à bascule du clavier, le code suivant s'exécute:
Cela provoque l'enregistrement de l'activité en cours dans un ensemble, puis l'activité démarre, en passant par un booléen qui indique si le clavier doit être affiché ou masqué.
Dans la méthode onCreate, le code suivant est exécuté:
Si le clavier virtuel doit être affiché, alors InputMethodManager est invité à afficher le clavier et la fenêtre est invitée à rendre l'entrée logicielle toujours visible. Si le clavier virtuel doit être masqué, le WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM est défini.
Cette approche fonctionne de manière fiable sur tous les appareils sur lesquels j'ai testé - depuis un téléphone HTC de 4 ans exécutant Android 2.2 jusqu'à un Nexus 7 exécutant 4.2.2. Le seul inconvénient de cette approche est que vous devez être prudent avec la manipulation du bouton de retour. Comme mon application n'a essentiellement qu'un seul écran (c'est une calculatrice), je peux remplacer onBackPressed () et revenir à l'écran d'accueil des appareils.
la source
Alternativement à cette solution complète , si vous vouliez fermer le clavier logiciel de n'importe où sans avoir de référence au champ (EditText) qui a été utilisé pour ouvrir le clavier, mais que vous vouliez toujours le faire si le champ était focalisé, vous pouvez utiliser ceci (d'une activité):
la source
Grâce à cette réponse SO , j'ai dérivé les éléments suivants qui, dans mon cas, fonctionnent bien lors du défilement des fragments d'un ViewPager ...
la source
Les réponses ci-dessus fonctionnent pour différents scénarios, mais si vous souhaitez masquer le clavier dans une vue et que vous avez du mal à obtenir le bon contexte, essayez ceci:
et pour que le contexte le récupère du constructeur :)
la source
Si vous souhaitez fermer le clavier virtuel lors d'un test unitaire ou fonctionnel, vous pouvez le faire en cliquant sur le "bouton retour" de votre test:
Je mets "bouton retour" entre guillemets, car ce qui précède ne déclenche pas le
onBackPressed()
pour l'activité en question. Il ferme simplement le clavier.Assurez-vous de faire une pause un peu avant de continuer, car il faut un peu de temps pour fermer le bouton de retour, de sorte que les clics ultérieurs vers Vues, etc., ne seront enregistrés qu'après une courte pause (1 seconde est assez longue ime ).
la source
Voici comment vous le faites dans Mono pour Android (AKA MonoDroid)
la source
searchbox
dans l'extrait?Cela a fonctionné pour moi pour tout le comportement bizarre du clavier
la source
Ajoutez à votre activité
android:windowSoftInputMode="stateHidden"
dans le fichier manifeste. Exemple:la source
Méthode simple et facile à utiliser, appelez simplement hideKeyboardFrom (YourActivity.this); masquer le clavier
la source
Utilisez simplement ce code optimisé dans votre activité:
la source
après cet appel sur onTouchListener:
la source
utilisez ceci
la source
Pour mon cas, j'utilisais le SearchView dans la barre d'actions. Après qu'un utilisateur a effectué une recherche, le clavier s'ouvrirait à nouveau.
L'utilisation de InputMethodManager n'a pas fermé le clavier. J'ai dû effacer Focus et définir le focusable de la vue de recherche sur false:
la source
clearFocus()
dans les pages d'API Android, donc cela n'a pas fonctionné pour moi, mais une autre solution l'a fait (voir ma réponse ci-dessous).J'ai le cas, où mon
EditText
peut être situé également dans unAlertDialog
, donc le clavier doit être fermé en cas de rejet. Le code suivant semble fonctionner n'importe où:la source
J'ai presque essayé toutes ces réponses, j'ai eu des problèmes aléatoires, en particulier avec le Samsung Galaxy S5.
Je finis par forcer le show et le hide, et cela fonctionne parfaitement:
la source