Schließen/verbergen Sie das Android Soft Keyboard mit Kotlin

Lesezeit: 4 Minuten

Benutzer-Avatar
Eugen Trifonov

Ich versuche, eine einfache Android-App in Kotlin zu schreiben. Ich habe einen EditText und einen Button in meinem Layout. Nachdem ich in das Bearbeitungsfeld geschrieben und auf den Button geklickt habe, möchte ich die virtuelle Tastatur ausblenden.

Da ist ein beliebte Frage Schließen/verstecken Sie das Android Soft Keyboard, um es in Java zu tun, aber soweit ich verstehe, sollte es eine alternative Version für Kotlin geben. Wie soll ich es machen?

Benutzer-Avatar
Gunhan

Verwenden Sie die folgenden Hilfsfunktionen in Ihren Aktivitäten, Fragmenten, um die Soft-Tastatur auszublenden.

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

fun Activity.hideKeyboard() {
    hideKeyboard(currentFocus ?: View(this))
}

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

Update für die neueste Kotlin-Version

Dadurch wird die Tastatur unabhängig von Ihrem Code entweder im Dialogfragment und / oder in der Aktivität usw. geschlossen.

hideKeyboard()

  • Verwendung in Aktivität/Fragment:

    Wo würden Sie diese drei Funktionen live in der Anwendung empfehlen?

    – Dan

  • 24. Juli 2018 um 21:18 Uhr

    @Dan Ich behalte diese Funktionen in meiner Datei ContextExtensions.kt, aber Sie können sie überall dort aufbewahren, wo Sie es für geeignet halten.

    – Gunhan

  • 25. Juli 2018 um 10:45 Uhr

    Dies funktionierte perfekt für mich. Das Lustige ist, dass ich diesen Code nur brauchte, als die App auf einem physischen Gerät lief. Auf dem Simulator (AVD) entließ sich die Tastatur wie eine gute Tastatur.

    – Dan

  • 26. Juli 2018 um 14:10 Uhr

    Wenn ich diese in eine ContextExtensions.kt-Datei stecke, kann ich aus irgendeinem Grund nicht von meinen Fragmenten usw. darauf zugreifen. Gibt es etwas Besonderes, das ich in der ContextExtensions-Klasse einrichten muss, um diese über die App zugänglich zu machen? ?

    – svguerin3

  • 15. Mai 2019 um 18:38 Uhr

    OMG vielen Dank dafür. Von iOS kommend erscheint es mir lächerlich, dass dies überhaupt ein Problem ist, aber Ihre Lösung ist die sauberste, die ich je gesehen habe. Vielen Dank!

    – Ricky Padilla

21. September 2020 um 18:26 Uhr
Benutzer-Avatar

Peter Szucs ViewIch denke, wir können Viktors Antwort ein wenig verbessern. Basierend darauf, dass es immer an a angehängt ist InputMethodManageres wird einen Kontext geben, und wenn es einen Kontext gibt, dann gibt es einen

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

:

  • Der Kontext bedeutet in diesem Fall automatisch den Kontext der Ansicht. Was denkst du?

    Ich möchte diese Methode in einer Utility-Klasse hinzufügen. Wie rufe ich diese Methode dann von Activity/Fragment/Adapter auf?

    – chandani c patel

  • 4. Januar 2018 um 6:44 Uhr editText.hideKeybord() gut verwenden zum Beispiel

    editText kann durch jede Ansicht ersetzt werden.

    – AndroLife

  • 12. November 2018 um 13:10 Uhr

    Gibt es eine Möglichkeit, dies in einer separaten Klasse zu platzieren, damit es in der gesamten App zugänglich ist?

    – svguerin3

15. Mai 2019 um 18:35 Uhr
Benutzer-Avatar

Zeeshan Ayaz

Überschreiben Sie diese Methode einfach in Ihrer Aktivität. Es funktioniert automatisch auch in seinen untergeordneten Fragmenten…..

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (getCurrentFocus() != null) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
    return super.dispatchTouchEvent(ev);
}

In Java

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        if (currentFocus != null) {
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)
        }
        return super.dispatchTouchEvent(ev)
    }

In Kotlin

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

Erstellen Sie in Ihrer Aktivität oder Ihrem Fragment eine Funktion als: your_button_id Angenommen, Sie haben eine Schaltfläche mit einer ID

    your_button_id.setOnClickListener{
       it.hideKeyboard()
     }

in der XML-Datei, die sich auf diese Aktivität oder dieses Fragment bezieht, also beim Klick auf die Schaltfläche:

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

Peters Lösung löst das Problem sauber, indem die Funktionalität der View-Klasse erweitert wird.  Ein alternativer Ansatz könnte darin bestehen, die Funktionalität der Activity-Klasse zu erweitern und somit den Vorgang zum Ausblenden der Tastatur mit dem Container von View und nicht mit View selbst zu verbinden.
Benutzer-Avatar

Andreas Fan

object Utils {

    fun hideSoftKeyBoard(context: Context, view: View) {
        try {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        } catch (e: Exception) {
            // TODO: handle exception
            e.printStackTrace()
        }

    }
}

Erstellen Sie eine Objektklasse namens Utils: BaseActivitySie können diese Methode in jeder Klasse verwenden, in der Sie die Soft-Input-Tastatur ausblenden möchten. Ich benutze das in meinem

.

Utils.hideSoftKeyBoard([email protected], view )

Hier ist die Ansicht jede Ansicht, die Sie in Ihrem Layout verwenden:
Benutzer-Avatar

MeLean

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

Ich habe diese Variante der Kotlin-Erweiterungsfunktion nicht gesehen:

  • Der Vorteil besteht darin, dass diese Erweiterungsfunktion von jeder CustomView und in jedem Click- oder Touch-Listener aufgerufen werden kann

    Lief wie am Schnürchen

    – Arjun Verma

1310680cookie-checkSchließen/verbergen Sie das Android Soft Keyboard mit Kotlin

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy