Wie kann ich die Android-Soft-Tastatur programmgesteuert schließen/ausblenden?

Lesezeit: 8 Minuten

ich habe ein EditText und ein Button in meiner Anordnung.

Nachdem Sie in das Bearbeitungsfeld geschrieben und auf die Schaltfläche geklickt haben Button, ich möchte die virtuelle Tastatur ausblenden, wenn ich außerhalb der Tastatur berühre. Ich gehe davon aus, dass dies ein einfaches Stück Code ist, aber wo finde ich ein Beispiel dafür?

  • Was ist, wenn Sie nur einen EditText und mehrere Schaltflächen wie Kontrollkästchen und Radios haben? Der einzige Ort, an dem Sie die Tastatur benötigen, ist der einzelne EditText. Wie erkennen Sie, dass etwas anderes ausgewählt/geklickt wurde, um die Tastatur auszublenden?

    – AlikElzin-kilaka

    1. Juni 2011 um 15:48 Uhr


  • Ich fühle mich dumm. Ich kann die Tastatur auf ICS nicht ausblenden. Versuchte alle Methoden hier und Kombinationen davon. Auf keinen Fall. Die Methode, es zu zeigen, funktioniert, aber ich kann es nicht verstecken, egal welches Windzeichen, Flaggen verstecken, Einstellungen oder Kerzen für Heilige manifestieren. In der Tastaturanzeige sehe ich immer Folgendes: I/LatinIME( 396): InputType.TYPE_NULL ist angegeben W/LatinIME( 396): Unexpected input class: inputType=0x00000000 imeOptions=0x00000000

    – rupps

    15. Mai 2013 um 13:28 Uhr


  • /** * Diese Methode wird verwendet, um die Soft-Tastatur zu verbergen. * @param activity */ public void hideSoftKeyboard(Activity activity) { InputMethodManager inputMethodManager = (InputMethodManager)activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); }

    – Harshal Benake

    13. Januar 2014 um 13:30 Uhr

  • das hat bei mir funktioniert

    – nmxprime

    20. Juni 2014 um 12:45 Uhr


  • Mit zunehmender Bildschirmgröße und Auflösung von Geräten wird das Ausblenden der virtuellen Tastatur immer weniger wichtig.

    – Al-Kathiri Khalid

    23. Januar 2017 um 9:15 Uhr

Um diesen Wahnsinn zu verdeutlichen, möchte ich mich zunächst im Namen aller Android-Nutzer für die geradezu lächerliche Behandlung der Soft-Tastatur durch Google entschuldigen. Der Grund dafür, dass es so viele Antworten gibt, jede anders, für dieselbe einfache Frage ist, dass diese API, wie viele andere in Android, schrecklich entworfen ist. Mir fällt keine höfliche Art ein, es auszudrücken.

Ich möchte die Tastatur ausblenden. Ich erwarte, Android mit der folgenden Erklärung zu versorgen: Keyboard.hide(). Das Ende. Vielen Dank. Aber Android hat ein Problem. Sie müssen die verwenden InputMethodManager um die Tastatur zu verstecken. OK, gut, das ist Androids API für die Tastatur. SONDERN! Sie müssen eine haben Context um Zugang zum IMM zu erhalten. Jetzt haben wir ein Problem. Möglicherweise möchte ich die Tastatur vor einer statischen oder Utility-Klasse verstecken, die keine Verwendung oder Notwendigkeit für eine hat Context. oder Und VIEL schlimmer, das IMM verlangt, dass Sie angeben, was View (oder noch schlimmer, was Window) vor der Sie die Tastatur ausblenden möchten.

Das macht das Verstecken der Tastatur so schwierig. Lieber Google: Wenn ich das Rezept für einen Kuchen nachschlage, gibt es kein RecipeProvider auf Erden, die sich weigern würden, mir das Rezept zu geben, es sei denn, ich antworte zuerst, von WEM der Kuchen gegessen wird UND wo er gegessen wird !!

Diese traurige Geschichte endet mit der hässlichen Wahrheit: Um die Android-Tastatur zu verstecken, müssen Sie sich auf zwei Arten identifizieren: a Context und entweder a View oder ein Window.

Ich habe eine statische Utility-Methode erstellt, die den Job SEHR solide erledigen kann, vorausgesetzt, Sie rufen sie von an auf Activity.

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //Find the currently focused view, so we can grab the correct window token from it.
    View view = activity.getCurrentFocus();
    //If no view currently has focus, create a new one, just so we can grab a window token from it
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Beachten Sie, dass diese Utility-Methode NUR funktioniert, wenn sie von einem aufgerufen wird Activity! Die obige Methode ruft auf getCurrentFocus des Ziels Activity um das richtige Fenstertoken abzurufen.

Angenommen, Sie möchten die Tastatur vor einem verbergen EditText gehostet in einem DialogFragment? Sie können die obige Methode dafür nicht verwenden:

hideKeyboard(getActivity()); //won't work

Dies funktioniert nicht, da Sie einen Verweis auf die übergeben Fragmentder Gastgeber Activitydie während der keine fokussierte Kontrolle haben wird Fragment wird gezeigt! Wow! Um die Tastatur vor Fragmenten zu verbergen, greife ich also auf die niedrigere Ebene zurück, häufiger und hässlicher:

public static void hideKeyboardFrom(Context context, View view) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Nachfolgend finden Sie einige zusätzliche Informationen, die aus der Zeitverschwendung bei der Suche nach dieser Lösung gewonnen wurden:

Über windowSoftInputMode

Es gibt noch einen weiteren Streitpunkt, dessen man sich bewusst sein sollte. Standardmäßig weist Android dem ersten automatisch den anfänglichen Fokus zu EditText oder fokussierbare Steuerung in Ihrem Activity. Daraus folgt natürlich, dass die InputMethod (typischerweise die Soft-Tastatur) auf das Fokusereignis reagiert, indem sie sich selbst zeigt. Das windowSoftInputMode Attribut ein AndroidManifest.xmlwenn eingestellt auf stateAlwaysHiddenweist die Tastatur an, diesen automatisch zugewiesenen anfänglichen Fokus zu ignorieren.

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

Fast unglaublich scheint es nichts zu tun, um zu verhindern, dass sich die Tastatur öffnet, wenn Sie das Steuerelement berühren (es sei denn focusable="false" und/oder focusableInTouchMode="false" sind der Steuerung zugeordnet). Anscheinend gilt die Einstellung windowSoftInputMode nur für automatische Fokusereignisse, nicht für Fokusereignisse, die durch Berührungsereignisse ausgelöst werden.

Deshalb, stateAlwaysHidden ist in der Tat SEHR schlecht benannt. Es sollte vielleicht heißen ignoreInitialFocus stattdessen.


UPDATE: Weitere Möglichkeiten, ein Fenstertoken zu erhalten

Wenn es keine fokussierte Ansicht gibt (kann zB passieren, wenn Sie gerade Fragmente geändert haben), gibt es andere Ansichten, die ein nützliches Fenster-Token liefern.

Dies sind Alternativen für den obigen Code if (view == null) view = new View(activity); Diese beziehen sich nicht explizit auf Ihre Tätigkeit.

Innerhalb einer Fragmentklasse:

view = getView().getRootView().getWindowToken();

Gegeben ein Fragment fragment als Parameter:

view = fragment.getView().getRootView().getWindowToken();

Ausgehend von Ihrem Inhaltskörper:

view = findViewById(android.R.id.content).getRootView().getWindowToken();

UPDATE 2: Fokus löschen, um zu vermeiden, dass die Tastatur erneut angezeigt wird, wenn Sie die App im Hintergrund öffnen

Fügen Sie diese Zeile am Ende der Methode hinzu:

view.clearFocus();

  • Warum brauchen getRootView() Warum nicht getView() nur?

    – ilw

    15. Dezember 2020 um 10:21 Uhr

  • Einzeiler: ((InputMethodManager)getContext().getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(getView().getWindowToken(), 0);

    – Martin Braun

    9. April 2021 um 23:26 Uhr


  • Kürzlich haben wir endlich einen offiziellen, abwärtskompatiblen Weg gefunden, dies zu tun

    – gmk57

    21. Mai 2021 um 13:33 Uhr

  • Endlich gibt es einen offiziellen Weg: stackoverflow.com/a/67683124/4985958

    – Sergej Chilingaryan

    25. Mai 2021 um 6:59 Uhr

  • Danke es ist hilfreich.

    – ImI

    1. Juni 2021 um 13:06 Uhr

  • Dies war die einzige, die im Jahr 2020 funktioniert hat. Ich habe einen Bearbeitungstext für die Hauptaktivität und möchte nicht, dass die Tastatur beim Starten der App angezeigt wird.

    – Brian M

    13. Dezember 2020 um 0:58 Uhr

Ich habe eine weitere Lösung, um die Tastatur auszublenden:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

Hier passieren HIDE_IMPLICIT_ONLY an der Stelle von showFlag und 0 an der Stelle von hiddenFlag. Die Soft-Tastatur wird zwangsweise geschlossen.

  • Sie verwenden ein Hide-Flag im Parameter showflags. Dies funktioniert nur, weil die Konstanten dieselben Ganzzahlen verwenden. Beispiel mit den richtigen Flags

    – Alex

    23. März 2013 um 14:35 Uhr

  • Getestet auf Android 4.0, ich mag diese Lösung, weil ich mehrere Bearbeitungstexte habe, Schaltflächen für diese Aktivität, die den Fokus haben können

    Benutzer529543

    16. Mai 2013 um 15:04 Uhr

  • Das funktioniert für mich, ich habe keine Textfelder oder irgendetwas, das wirklich fokussiert ist.

    – Basilio Deutsch

    6. Juni 2013 um 18:30 Uhr


  • @Mark: Weil die Methode “toggleSoftInput” heißt, nicht “hideSoftInput” 🙂

    – Sver

    30. August 2013 um 2:08 Uhr

  • Das funktioniert nicht richtig. Es zeigt manchmal die Tastatur.

    – Rohaitas Tanoli

    3. September 2021 um 11:30 Uhr

Meiers Lösung funktioniert auch bei mir. In meinem Fall ist die oberste Ebene meiner App ein Tab-Host und ich möchte das Schlüsselwort beim Wechseln der Tabs ausblenden – ich bekomme das Fenster-Token aus der Tab-Host-Ansicht.

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}

  • Sie verwenden ein Hide-Flag im Parameter showflags. Dies funktioniert nur, weil die Konstanten dieselben Ganzzahlen verwenden. Beispiel mit den richtigen Flags

    – Alex

    23. März 2013 um 14:35 Uhr

  • Getestet auf Android 4.0, ich mag diese Lösung, weil ich mehrere Bearbeitungstexte habe, Schaltflächen für diese Aktivität, die den Fokus haben können

    Benutzer529543

    16. Mai 2013 um 15:04 Uhr

  • Das funktioniert für mich, ich habe keine Textfelder oder irgendetwas, das wirklich fokussiert ist.

    – Basilio Deutsch

    6. Juni 2013 um 18:30 Uhr


  • @Mark: Weil die Methode “toggleSoftInput” heißt, nicht “hideSoftInput” 🙂

    – Sver

    30. August 2013 um 2:08 Uhr

  • Das funktioniert nicht richtig. Es zeigt manchmal die Tastatur.

    – Rohaitas Tanoli

    3. September 2021 um 11:30 Uhr

Bitte versuchen Sie diesen Code unten onCreate()

EditText edtView = (EditText) findViewById(R.id.editTextConvertValue);
edtView.setInputType(InputType.TYPE_NULL);

  • Diese Methode funktioniert als Mittel, um den Fehler „Soft-Tastatur kann nicht ausgeblendet werden“ in 2.0 und 2.1 zu umgehen, wie in beschrieben code.google.com/p/android/issues/detail?id=7115 … die oben aufgeführte Methode hideSoftInputFromWindow funktionierte nicht, als ich sie versuchte, aber editView.setInputType(0) tat es.

    – Spike-Williams

    17. April 2010 um 5:50 Uhr

  • Dies ist per Javadoc legitim (kein Hack), obwohl ich die Methode so umschreiben würde editView.setInputType(InputType.TYPE_NULL);

    – Boston

    11. Oktober 2010 um 20:49 Uhr

  • das funktioniert, allerdings versteckt es den android:hint. Ich verwende Android 1.5

    – Tirta

    11. Januar 2012 um 10:32 Uhr

  • Dies ist großartig, wenn Sie die Tastatur aus einem Dialog schließen müssen, keine Instanz oder ähnliches abrufen müssen und dies allen Bearbeitungstexten zuweisen können, wenn der Benutzer eine Schaltfläche drückt, die den Dialog schließt

    – Ich bin_mit_dumm

    26. Dezember 2014 um 21:38 Uhr

  • Es funktioniert, aber es versteckt auch den Cursor. Ich brauche den Cursor, aber keine Systemtastatur.

    – Stefan Brendel

    8. August 2016 um 18:51 Uhr

1005580cookie-checkWie kann ich die Android-Soft-Tastatur programmgesteuert schließen/ausblenden?

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

Privacy policy