web-dev-qa-db-fra.com

Fermer/cacher le clavier virtuel Android avec Kotlin

J'essaie d'écrire une application Android simple dans Kotlin. J'ai un EditText et un bouton dans ma mise en page. Après avoir écrit dans le champ d'édition et cliqué sur le bouton, je souhaite masquer le clavier virtuel. 

Il existe une question populaire _ ​​{ Fermer/Masquer le clavier virtuel Android à propos de le faire en Java, mais pour autant que je sache, il devrait exister une version alternative pour Kotlin. Comment devrais-je le faire?

9
Eugene Trifonov

Je pense que nous pouvons améliorer un peu la réponse de Viktor. Basé sur le fait qu'il est toujours attaché à une vue, il y aura un contexte. S'il y a un contexte, alors il y a InputMethodManager.

fun View.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)
}

Dans ce cas, le contexte signifie automatiquement le contexte de la vue ..__Que pensez-vous?

24
Péter Szűcs

Utilisez les fonctions utilitaires suivantes dans vos activités, fragments pour masquer le clavier virtuel.

(*) Mise à jour pour la dernière version de Kotlin

fun Fragment.hideKeyboard() {
    view?.let { activity?.hideKeyboard(it) }
}

fun Activity.hideKeyboard() {
    hideKeyboard(if (currentFocus == null) View(this) else currentFocus)
}

fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

Ancienne réponse:

fun Fragment.hideKeyboard() {
    activity.hideKeyboard(view)
}

fun Activity.hideKeyboard() {
    hideKeyboard(if (currentFocus == null) View(this) else currentFocus)
}

fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

Cela fermera le clavier quel que soit votre code, que ce soit dans un fragment de dialogue ou dans une activité, etc.

Utilisation dans l'activité/Fragment:

hideKeyboard()
15
Gunhan

La solution de Peter résout parfaitement le problème en étendant les fonctionnalités de la classe View. Une autre approche pourrait consister à étendre les fonctionnalités de la classe d'activité et ainsi lier les opérations de masquage du clavier au conteneur de View plutôt qu'à View lui-même.

fun Activity.hideKeyboard() {
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(findViewById(Android.R.id.content).getWindowToken(), 0);
}
4
michal.z

Vous pouvez utiliser Anko pour vous simplifier la vie, la ligne serait donc:

inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

ou peut-être mieux créer une fonction d'extension:

fun View.hideKeyboard(inputMethodManager: InputMethodManager) {
    inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

et appelez ça comme ça:

view?.hideKeyboard(activity.inputMethodManager)
2
Viktor Yakunin

J'ai trouvé la réponse qui fonctionnait pour moi ici: http://programminget.blogspot.com/2017/08/how-to-close-Android-soft-keyboard.html

val inputManager:InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.hideSoftInputFromWindow(currentFocus.windowToken, InputMethodManager.SHOW_FORCED)
1
Scooter

Cela fonctionne bien avec API 26. 

val view: View = if (currentFocus == null) View(this) else currentFocus
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
1
Kavin Varnan

Vous pouvez utiliser du code ci-dessous, je l'écris dans mon fragment:

private val myLayout = ViewTreeObserver.OnGlobalLayoutListener {
    yourTextView.isCursorVisible = KeyboardTool.isSoftKeyboardShown(myRelativeLayout.rootView)
}

Puis dans onViewCreated de fragment:

......
super.onViewCreated(view, savedInstanceState)
myRelativeLayout.viewTreeObserver.addOnGlobalLayoutListener(myLayout)
......

Et dans onDestroyView utiliser aussi:

override fun onDestroyView() {
    super.onDestroyView()
 myRelativeLayout.viewTreeObserver.removeOnGlobalLayoutListener(myLayout)
}

Et:

object KeyboardTool {
    fun isSoftKeyboardShown(rootView: View): Boolean {
        val softKeyboardHeight = 100
        val rect = Rect()

        rootView.getWindowVisibleDisplayFrame(rect)

        val dm = rootView.resources.displayMetrics
        val heightDiff = rootView.bottom - rect.bottom
        return heightDiff > softKeyboardHeight * dm.density
    }
}
0
jo jo