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:
privatevoid hideSoftKeyBoard(){InputMethodManager imm =(InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);if(imm.isAcceptingText()){// verify if the soft keyboard is open
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);}}
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.
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 )asInputMethodManagerif( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow(this.currentFocus.windowToken,/*flags:*/0)}
Ensuite, consommez simplement en utilisant:
// from activitythis.dismissKeyboard()// from fragment
activity.dismissKeyboard()
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:
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)asInputMethodManager}
val windowHeightMethod =InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm)asIntif(height >0){
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,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)asInputMethodManager}/**
* 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:
Réponses:
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
la source
getActivity()
)getCurrentFocus().getWindowToken()
pour le premier argumenthideSoftInputFromWindow()
. Aussi, faites-le dans leonPause()
et non leonStop()
si vous essayez de le faire disparaître lorsque vous changez d'activité.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:
la source
isAcceptingText()
a rendu cette réponse meilleure que d'autresC'est ma solution
la source
vous pouvez également utiliser ce code sur l'événement de clic de bouton
la source
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)
Ensuite, consommez simplement en utilisant:
la source
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:
la source
la source
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.
la source
En utilisant le contexte de la vue, nous pouvons obtenir le résultat souhaité avec les méthodes d'extension suivantes dans Kotlin:
Une fois ceux-ci en place, il vous suffit d'appeler:
la source