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

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.


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;
    }
});

Ç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) {

        }
    }
});

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.


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);

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)

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);

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);
}

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);

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}

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)

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);
}

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);

-2

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.