Fermer le clavier virtuel en appuyant sur un bouton

133

J'ai un Activityavec un EditText, un bouton et un ListView. Le but est de saisir un écran de recherche dans le EditText, appuyez sur le bouton et que les résultats de la recherche remplissent cette liste.

Tout cela fonctionne parfaitement, mais le clavier virtuel se comporte de manière étrange.

Si je clique sur EditText, j'obtiens le clavier virtuel. Si je clique sur le bouton «Terminé» du clavier virtuel, il disparaît. Cependant, si je clique sur mon bouton de recherche avant de cliquer sur "Terminé" sur le clavier virtuel, le clavier virtuel reste et je ne peux pas m'en débarrasser. Cliquer sur le bouton "Terminé" ne ferme pas le clavier. Il change le bouton «Terminé» de «Terminé» en flèche et reste visible.

Merci de votre aide

Andrew
la source

Réponses:

304
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

J'ai mis ça juste après l' onClick(View v)événement.

Vous devez importer android.view.inputmethod.InputMethodManager;

Le clavier se masque lorsque vous cliquez sur le bouton.

Paul Maserrat
la source
55
Remarque: (au cas où vous voudriez utiliser cette méthode dans les cas où il pourrait ne pas y avoir de focus (par exemple onPause (), etc.): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai
5
Vous devez également importer le contexte.
Si8
4
ATTENTION: lance NPE si le clavier est déjà masqué. Suivez le commentaire de Peter pour éviter cela.
Don Larynx
pourquoi le clavier apparaît-il après un clic sur un bouton non pertinent? quelqu'un peut-il fournir des explications ou un lien?
kommradHomer
1
Fonctionne comme du charme!
ARiF
59
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});
Andrew
la source
Ça marche pour moi. Merci!
Aman Goyal le
29

Utilisez le code ci-dessous

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});
Prashant Maheshwari Andro
la source
2
Attraper une exception au lieu d'une simple vérification nulle, sérieusement?!
Dr Glass
Travailler pour moi, cache le clavier sur le clic du bouton
ashishdhiman2007
solution simple à ce dont j'avais besoin: masquer le clavier après avoir cliqué sur le bouton de recherche.
dawoodman71
13

Vous devez implémenter OnEditorActionListenerpour votre EditView

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

Et vous masquez le clavier par:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

Vous devez également déclencher le clavier caché dans votre bouton en utilisant onClickListener

Maintenant, cliquer sur «Terminé» sur le clavier virtuel et le bouton fera de même - masquer le clavier et effectuer une action de clic.

pixel
la source
Excellent, mais je ne suis pas tout à fait le suivant. Je pense que le message a mangé une partie du code (il n'y a rien après "public void" dans votre exemple). J'ai essayé de setOnEditorActionListner dans la méthode onCreate de mon activité, mais il ne sait pas ce qu'est setOnEditorActionListener. Je reçois une notification "Type interne anonyme". (Je fais cela dans ma méthode Activity onCreate) i37.tinypic.com/6ozkig.png
Andrew
1
Il semble qu'il y ait quelques erreurs dans ce code, mais c'est la bonne idée. D'une part, l'interface OnEditorActionListener est une classe interne, vous devez donc soit l'importer explicitement (Eclipse ne le fera pas pour vous dans ce cas), soit y faire référence en tant que TextView.OnEditorActionListener.
MatrixFrog
J'ai un peu de mal. J'ai implémenté onEditorActionListener (la classe publique SearchActivity étend ListActivity implémente OnClickListener, OnEditorActionListener), j'ai attaché un auditeur à mon EditText (mSearchText.setOnEditorActionListener (this);), mais Eclipse ne me permettra pas de remplacer le gestionnaire onEditorAction (TextView v, int actionId, événement KeyEvent)). Il dit qu'il doit remplacer une méthode de superclasse. Des idées?
Andrew
Bonjour, vous pouvez intégrer votre OnEditorActionListener en tapant yourEditView.setOnEditorActionListener (new OnEditorActionListener () {....
pixel
11

Ajoutez le code suivant dans votre événement de clic de bouton:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Ashana.Jackol
la source
1
Fonctionne comme du charme!
coderpc
10

Étant donné que vous n'avez qu'un seul texte d'édition, appelez simplement l'action effectuée pour ce texte d'édition à l'intérieur de votre bouton et le reste est géré par le système. Si vous aviez plus d'un edittext, ce ne serait pas aussi efficace car vous devez d'abord obtenir l'edittext ciblé. Mais dans votre cas, cela fonctionnera parfaitement

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)
Laert
la source
1
Pouvez-vous expliquer pourquoi votre solution fonctionne afin que d'autres puissent la comprendre et en tirer des leçons? Merci!
Shawn
Bien sûr Shawn. Je viens de modifier le haut, car je suis nouveau dans la pose si ce n'est pas clair, faites le moi savoir et je vais développer avec le bouton en cliquant
Laert
Croyez-moi, c'est l'un des moyens les plus élégants d'y parvenir. Merci @Laert
WitVault
9

Pour l'activité,

InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

Pour les fragments, utilisez getActivity ()

getActivity (). getSystemService ();

getActivity (). getCurrentFocus ();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
Priya Rajan
la source
7

Cette solution fonctionne parfaitement pour moi:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
Giedrius Šlikas
la source
3

Essaye ça...

  1. Pour afficher le clavier

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Pour masquer le clavier

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
Affa Musaffa
la source
La méthode "For Hide keyboard" est un toogle (cacher si est visible, montrer si est caché) pas un hide,
Ninja Coding
1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}
Farruh Habibullaev
la source
Salut! Bien que cette réponse puisse suffire aux besoins de @Andrew, ce serait formidable, si vous pouviez la prolonger avec quelques explications, pour vous assurer que les futurs lecteurs puissent en profiter pleinement!
derM
1

Exemple de Kotlin:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

à partir du fragment:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

de l'activité:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
norbDEV
la source
0

Vous utilisez ce code dans votre événement de clic de bouton

// 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);
}
Pankaj Talaviya
la source
0

Correction d'exception Crash Null Point: J'ai eu un cas où le clavier pouvait ne pas s'ouvrir lorsque l'utilisateur cliquait sur le bouton. Vous devez écrire une instruction if pour vérifier que getCurrentFocus () n'est pas une valeur nulle:

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
CacheMeOutside
la source
-2

Si vous définissez android:singleLine="true", le bouton masque automatiquement le clavier ¡

Terranologie
la source