Um diesen Wahnsinn aufzuklären, möchte ich mich zunächst im Namen aller Android-Nutzer für Googles geradezu lächerliche Behandlung der weichen Tastatur entschuldigen. Der Grund, warum es so viele verschiedene Antworten auf dieselbe einfache Frage gibt, ist, dass diese API, wie viele andere in Android, schrecklich konzipiert ist. Mir fällt kein höflicher Weg ein, dies zu sagen.
Ich möchte die Tastatur verstecken. Ich erwarte, dass ich Android mit der folgenden Anweisung versorge: Keyboard.hide()
. Das Ende. Ich danke Ihnen sehr. Aber Android hat ein Problem. Sie müssen die InputMethodManager
um die Tastatur auszublenden. OK, gut, das ist die API von Android für die Tastatur. ABER! Sie benötigen eine Context
um Zugang zur IMM zu erhalten. Jetzt haben wir ein Problem. Vielleicht möchte ich die Tastatur vor einer statischen oder Utility-Klasse verstecken, die keine Verwendung oder Notwendigkeit für eine Context
. oder, was noch viel schlimmer ist, die IMM verlangt, dass Sie angeben, was View
(oder noch schlimmer, was Window
), aus dem Sie die Tastatur ausblenden möchten.
Das macht das Verstecken der Tastatur so schwierig. Liebes Google: Wenn ich nach dem Rezept für einen Kuchen suche, gibt es keine RecipeProvider
auf der Welt, die sich weigern würde, mir das Rezept zu geben, wenn ich nicht zuerst beantworte, WER den Kuchen essen wird UND wo er gegessen wird!!!
Diese traurige Geschichte endet mit der hässlichen Wahrheit: Um die Android-Tastatur zu verstecken, müssen Sie zwei Ausweise vorlegen: einen Context
und entweder eine View
oder eine Window
.
Ich habe eine statische Dienstprogramm-Methode erstellt, die die Aufgabe SEHR solide erledigen kann, vorausgesetzt, Sie rufen sie von einer 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 einer Activity
! Die obige Methode ruft getCurrentFocus
des Ziels Activity
um das richtige Fenster-Token zu holen.
Aber nehmen wir an, Sie möchten die Tastatur vor einem EditText
beherbergt in einer DialogFragment
? Die obige Methode ist dafür nicht geeignet:
hideKeyboard(getActivity()); //won't work
Dies wird nicht funktionieren, da Sie einen Verweis auf die Fragment
Der Gastgeber Activity
die keine gezielte Kontrolle haben, während die Fragment
wird gezeigt! Wahnsinn! Um also die Tastatur vor Fragmenten zu verstecken, greife ich auf die niedrigere, häufigere und hässlichere Ebene zurück:
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 ich nach längerer Suche nach dieser Lösung gesammelt habe:
Über windowSoftInputMode
Es gibt noch einen weiteren Streitpunkt, der zu beachten ist. Standardmäßig weist Android den anfänglichen Fokus automatisch dem ersten EditText
oder fokussierbare Steuerung in Ihrem Activity
. Daraus folgt natürlich, dass die InputMethod (in der Regel die Soft-Tastatur) auf das Fokus-Ereignis reagiert, indem sie sich selbst anzeigt. Die windowSoftInputMode
Attribut in AndroidManifest.xml
wenn sie auf stateAlwaysHidden
weist die Tastatur an, diesen automatisch zugewiesenen anfänglichen Fokus zu ignorieren.
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
Es ist kaum zu glauben, aber es scheint nicht zu verhindern, dass sich die Tastatur öffnet, wenn Sie das Steuerelement berühren (außer focusable="false"
und/oder focusableInTouchMode="false"
der Steuerung zugewiesen sind). Offenbar 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. Er sollte vielleicht folgendermaßen heißen ignoreInitialFocus
stattdessen.
UPDATE: Weitere Möglichkeiten, ein Fenster-Token zu erhalten
Wenn es keine fokussierte Ansicht gibt (was z. B. passieren kann, wenn Sie gerade Fragmente gewechselt haben), gibt es andere Ansichten, die ein nützliches Window-Token liefern.
Dies sind Alternativen für den obigen Code if (view == null) view = new View(activity);
Diese beziehen sich nicht ausdrücklich 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 Textkörper:
view = findViewById(android.R.id.content).getRootView().getWindowToken();
UPDATE 2: Fokus löschen, um zu verhindern, dass die Tastatur erneut angezeigt wird, wenn Sie die App im Hintergrund öffnen
Fügen Sie diese Zeile an das Ende der Methode an:
view.clearFocus();
19 Stimmen
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 registrieren Sie, dass etwas anderes gewählt/angeklickt wurde, um die Tastatur auszublenden?
19 Stimmen
Ich komme mir dumm vor. Ich bin nicht in der Lage, die Tastatur auf ICS zu verstecken. Habe alle Methoden hier und Kombinationen von ihnen versucht. Keine Chance. Die Methode, um es zu zeigen, funktioniert, aber ich kann es nicht verstecken, egal, was windw Token, verstecken Flaggen, manifestieren Einstellungen oder Kerzen zu jedem Heiligen. Auf der Tastatur zeigen, sehe ich immer diese: I/LatinIME( 396): InputType.TYPE_NULL ist angegeben W/LatinIME( 396): Unerwartete Eingabeklasse: inputType=0x00000000 imeOptions=0x00000000
5 Stimmen
/** * Diese Methode wird verwendet, um die Soft-Tastatur auszublenden. * @param activity */ public void hideSoftKeyboard(Activity activity) { InputMethodManager inputMethodManager = (InputMethodManager)activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); }
0 Stimmen
este hat bei mir funktioniert
0 Stimmen
Da die Geräte immer größere Bildschirme und höhere Auflösungen haben, wird das Ausblenden der virtuellen Tastatur immer unwichtiger.
0 Stimmen
Müssen mit InputMethodManager mit dem INPUT_METHOD_SERVICE zu spielen, um Soft-Tastatur wie behandeln readyandroid.wordpress.com/show-hide-Android-soft-keyboard
0 Stimmen
Ist das Ihr Ernst? Kann man die Tastatur nicht einfach ausblenden, wenn man das möchte? Es spielt keine Rolle, ob Sie viele Tasten oder Text oder einen großen Bildschirm haben, um Android zu bitten, die Tastatur auszublenden, muss eine einzige Anweisung sein :S