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