Question Fermer / masquer le clavier logiciel Android


j'ai un EditText et un Button dans ma disposition.

Après avoir écrit dans le champ d'édition et en cliquant sur Button, Je veux cacher le clavier virtuel. Je suppose que c'est un simple code, mais où puis-je trouver un exemple?


3085


origine


Réponses:


Pour aider à clarifier cette folie, je voudrais commencer par présenter des excuses au nom de tous les utilisateurs d'Android pour le traitement carrément ridicule de Google du 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 sur Android, est horriblement conçue. Je ne peux penser à aucune façon polie de l'énoncer.

Je veux cacher le clavier. Je m'attends à fournir Android avec la déclaration suivante: Keyboard.hide(). La fin. Merci beaucoup. Mais Android a un problème. Vous devez utiliser le InputMethodManager cacher le clavier OK, d'accord, c'est l'API d'Android au clavier. MAIS! Vous devez avoir un Context afin d'avoir accès à l'IMM. Maintenant, nous avons un problème. Je peux vouloir cacher le clavier d'une classe statique ou d'utilité qui n'a aucun usage ou besoin de Context. ou bien pire, l'IMM exige que vous spécifiez View (ou pire encore, quoi Window) vous voulez cacher le clavier.

C'est ce qui rend le clavier si difficile. Cher Google: Quand je cherche la recette pour un gâteau, il n'y a pas RecipeProvider sur Terre qui refuserait de me fournir la recette à moins que je ne réponde d'abord à OMS le gâteau sera mangé par ET où il sera mangé !!

Cette histoire triste se termine avec la vérité laide: pour cacher le clavier Android, vous devrez fournir 2 formes d'identification: un Context et soit un View ou un Window.

J'ai créé une méthode utilitaire statique qui peut faire le travail très solidement, à condition que vous l'appelez d'un Activity.

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //Find the currently focused view, so we can grab the correct window token from it.
    View view = activity.getCurrentFocus();
    //If no view currently has focus, create a new one, just so we can grab a window token from it
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Sachez que cette méthode utilitaire fonctionne UNIQUEMENT lorsqu'elle est appelée depuis un Activity! Les appels de méthode ci-dessus getCurrentFocus de la cible Activity pour aller chercher le jeton de fenêtre approprié.

Mais supposons que vous vouliez cacher le clavier d'un EditText hébergé dans un DialogFragment? Vous ne pouvez pas utiliser la méthode ci-dessus pour cela:

hideKeyboard(getActivity()); //won't work

Cela ne fonctionnera pas parce que vous allez passer une référence à la Fragmentl'hôte Activity, qui n'aura aucun contrôle ciblé tandis que le Fragment est montré! Hou la la! Donc, pour cacher le clavier des fragments, j'ai recours au niveau inférieur, plus commun et plus laide:

public static void hideKeyboardFrom(Context context, View view) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Voici quelques informations supplémentaires glanées à partir de plus de temps perdu à courir après cette solution:

À propos de windowSoftInputMode

Il y a encore un autre point de discorde à connaître. Par défaut, Android attribue automatiquement le focus initial au premier EditText ou le contrôle focalisable dans votre Activity. Il s'ensuit naturellement que InputMethod (généralement le clavier logiciel) répondra à l'événement focus en s'affichant. le windowSoftInputMode attribuer dans AndroidManifest.xml, lorsqu'il est réglé sur stateAlwaysHidden, demande au clavier d'ignorer ce focus initial assigné automatiquement.

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

Presque incroyablement, il semble ne rien faire pour empêcher le clavier d'ouvrir lorsque vous touchez le contrôle (à moins que focusable="false" et / ou focusableInTouchMode="false" sont affectés au contrôle). Apparemment, le paramètre windowSoftInputMode s'applique uniquement aux événements de mise au point automatique, et non aux événements déclenchés à partir d'événements tactiles.

Donc, stateAlwaysHidden est TRÈS mal nommé en effet. Il devrait peut-être être appelé ignoreInitialFocus au lieu.

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 focalisée (par exemple si vous venez de modifier des fragments), d'autres vues fourniront un jeton de fenêtre utile.

Ce sont des alternatives pour le code ci-dessus if (view == null) view = new View(activity);  Ceux-ci ne se réfèrent pas explicitement à votre activité.

Dans une classe de fragments:

view = getView().getRootView().getWindowToken();

Étant donné un fragment fragment en paramètre:

view = fragment.getView().getRootView().getWindowToken();

À partir de votre corps de contenu:

view = findViewById(android.R.id.content).getRootView().getWindowToken();

UPDATE 2: Effacer le focus pour éviter d'afficher à nouveau le clavier si vous ouvrez l'application depuis l'arrière-plan

Ajoutez cette ligne à la fin de la méthode:

view.clearFocus();


1008



Vous pouvez forcer Android à masquer le clavier virtuel en utilisant InputMethodManager, en appelant hideSoftInputFromWindow, en passant dans le jeton de la fenêtre contenant votre vue focalisée.

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Cela forcera le clavier à être caché dans toutes les situations. Dans certains cas, vous voudrez passer InputMethodManager.HIDE_IMPLICIT_ONLY comme deuxième paramètre pour vous assurer que vous ne cachez le clavier que lorsque l'utilisateur ne l'a pas explicitement forcé à apparaître (en maintenant le menu enfoncé).

Remarque: Si vous voulez faire cela à Kotlin, utilisez: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager


4171



Aussi utile pour cacher le clavier logiciel est:

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);

Cela peut être utilisé pour supprimer le clavier logiciel jusqu'à ce que l'utilisateur touche réellement la vue editText.


741



J'ai une autre solution pour cacher le clavier:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

Ici passe HIDE_IMPLICIT_ONLY à la position de showFlag et 0 à la position de hiddenFlag. Il fermera avec force le clavier souple.


294



La solution de Meier fonctionne pour moi aussi. Dans mon cas, le plus haut niveau de mon application est un tabHost et je veux cacher le mot-clé lors du changement d'onglet - Je reçois le jeton de la fenêtre de l'ongletHost View.

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}

128



S'il vous plaît essayez ce code ci-dessous dans onCreate()

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);

115



Mettre à jour: Je ne sais pas pourquoi cette solution ne marche plus (je viens de tester sur Android 23). S'il vous plaît utiliser la solution de Saurabh Pareek au lieu. C'est ici:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

Vieille réponse:

//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

107



protected void hideSoftKeyboard(EditText input) {
    input.setInputType(0);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}

63