Android ignorer le clavier

147

Comment fermer le clavier lorsqu'un bouton est enfoncé?

Manikandan
la source
Make a EditText Focusable = False fait le travail. Voulez-vous le désactiver complètement?
st0le

Réponses:

325

Vous souhaitez désactiver ou ignorer un clavier virtuel?

Si vous voulez simplement le rejeter, vous pouvez utiliser les lignes de code suivantes dans votre bouton en cliquant sur Événement

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
DeRagan
la source
1
Deux problèmes avec ceci .... l'un est que myEditText doit être final. Deuxièmement, je dois savoir quelle boîte EditText a le focus. Une solution à cela?
Ethan Allen
78
Pour toute autre personne qui trébuche ici, vous pouvez utiliser l'activité (soit l'activité dans laquelle vous vous trouvez ou les fragments getActivity()) getCurrentFocus().getWindowToken()pour le premier argument hideSoftInputFromWindow(). Aussi, faites-le dans le onPause()et non le onStop()si vous essayez de le faire disparaître lorsque vous changez d'activité.
Drake Clarris
2
Cette réponse, combinée avec le commentaire ici, a totalement résolu mon problème!
aveschini
9
Quelle approche laide et laide de rejeter un clavier. J'espère qu'il y aura un moyen plus propre à l'avenir de faire une chose aussi simple.
Subby
73

La solution ci-dessus ne fonctionne pas pour tous les appareils et de plus, elle utilise EditText comme paramètre. C'est ma solution, appelez simplement cette méthode simple:

private void hideSoftKeyBoard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

    if(imm.isAcceptingText()) { // verify if the soft keyboard is open                      
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}
user2167877
la source
3
isAcceptingText()a rendu cette réponse meilleure que d'autres
user1506104
Bonne solution ... dans de rares cas, isAcceptingText () peut renvoyer false lorsque le clavier est toujours à l'écran, par exemple, cliquez loin de EditText vers un texte qui peut être sélectionné mais pas modifié dans la même fenêtre.
Georgie
29

C'est ma solution

public static void hideKeyboard(Activity activity) {
    View v = activity.getWindow().getCurrentFocus();
    if (v != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
}
RPM
la source
C'est si vous connaissez la vue qui a provoqué l'affichage du clavier.
RPM du
16

vous pouvez également utiliser ce code sur l'événement de clic de bouton

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Kandha
la source
13

Voici une solution Kotlin (mélange des différentes réponses dans le fil)

Créer une fonction d'extension (peut-être dans une classe ViewHelpers commune)

fun Activity.dismissKeyboard() {
    val inputMethodManager = getSystemService( Context.INPUT_METHOD_SERVICE ) as InputMethodManager
    if( inputMethodManager.isAcceptingText )
        inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, /*flags:*/ 0)
}

Ensuite, consommez simplement en utilisant:

// from activity
this.dismissKeyboard()

// from fragment
activity.dismissKeyboard()
Marchy
la source
5

La première solution avec InputMethodManager a fonctionné comme un champion pour moi, la méthode getWindow (). SetSoftInputMode ne fonctionnait pas sur Android 4.0.3 HTC Amaze.

@Ethan Allen, je n'avais pas besoin de rendre le texte d'édition définitif. Peut-être que vous utilisez une classe interne EditText que vous avez déclarée la méthode contenant? Vous pouvez faire de EditText une variable de classe de l'activité. Ou déclarez simplement un nouveau EditText dans la classe / méthode interne et utilisez à nouveau findViewById (). De plus, je n'ai pas trouvé que j'avais besoin de savoir quel EditText dans le formulaire avait le focus. Je pourrais simplement en choisir un arbitrairement et l'utiliser. Ainsi:

    EditText myEditText= (EditText) findViewById(R.id.anyEditTextInForm);  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
Andy
la source
3
Bienvenue dans Stack Overflow! C'est vraiment un commentaire, pas une réponse. Avec un peu plus de rep, vous pourrez poster des commentaires .
Jack
4
    public static void hideSoftInput(Activity activity) {
    try {
        if (activity == null || activity.isFinishing()) return;
        Window window = activity.getWindow();
        if (window == null) return;
        View view = window.getCurrentFocus();
        //give decorView a chance
        if (view == null) view = window.getDecorView();
        if (view == null) return;

        InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm == null || !imm.isActive()) return;
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    } catch (Throwable e) {
        e.printStackTrace();
    }
}
androidmalin
la source
1

Cette solution s'assure qu'il cache le clavier et ne fait rien s'il n'est pas ouvert. Il utilise l'extension afin de pouvoir être utilisé à partir de n'importe quelle classe de propriétaire de contexte.


fun Context.dismissKeyboard() {
    val imm by lazy { this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
    val windowHeightMethod = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
    val height = windowHeightMethod.invoke(imm) as Int
    if (height > 0) {
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
    }
}

Mahmoud Mabrok
la source
0

En utilisant le contexte de la vue, nous pouvons obtenir le résultat souhaité avec les méthodes d'extension suivantes dans Kotlin:

/**
 * Get the [InputMethodManager] using some [Context].
 */
fun Context.getInputMethodManager(): InputMethodManager {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return getSystemService(InputMethodManager::class.java)
    }

    return getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}

/**
 * Dismiss soft input (keyboard) from the window using a [View] context.
 */
fun View.dismissKeyboard() = context
        .getInputMethodManager()
        .hideSoftInputFromWindow(
                windowToken
                , 0
        )

Une fois ceux-ci en place, il vous suffit d'appeler:

editTextFoo.dismiss()
masterwok
la source