web-dev-qa-db-fra.com

Fermer le clavier virtuel en appuyant sur un bouton

J'ai une Activity avec une EditText, un bouton et une ListView. Le but est de taper un écran de recherche dans EditText, d'appuyer sur le bouton et de faire en sorte 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, je reçois 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 une flèche et reste visible.

Merci de votre aide

123
Andrew
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;
    }
});
55
Andrew
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

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

Je mets cela juste après l'événement onClick(View v)

Vous devez importer Android.view.inputmethod.InputMethodManager;

Le clavier se cache lorsque vous cliquez sur le bouton.

289
Paul Maserrat

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

        }
    }
});

Vous devez implémenter OnEditorActionListener pour 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 cachez 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 

Cliquez maintenant sur «Terminé» sur le clavier et le bouton virtuels pour obtenir le même résultat: masquer le clavier et effectuer une action de clic.

13
pixel

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);
11
Ashana.Jackol

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);
8
Priya Rajan

Puisque vous n'avez qu'un texte d'édition, il suffit d'appeler l'action effectuée pour ce texte d'édition dans le clic de votre bouton et le reste est traité par le système. Si vous aviez plus d'un edittext, cela ne serait pas aussi efficace car vous devez d'abord obtenir le edittext ciblé. Mais dans votre cas cela fonctionnera parfaitement 

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)
8
Laert

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);
}
6
Giedrius Šlikas

Essaye ça...

  1. Pour montrer 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);
    
2
Affa Musaffa
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}
1

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
Pankaj Talaviya

Crash Null Point Fix Solution: J'ai eu un cas où le clavier pourrait ne pas s'ouvrir lorsque l'utilisateur clique sur le bouton. Vous devez écrire une instruction if pour vérifier que getCurrentFocus () n'est pas null:

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

Exemple Kotlin:

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

de fragment: 

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

de l'activité:

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