Ich habe ein EditText
und ein Button
in meinem Layout.
Nachdem Button
ich in das Bearbeitungsfeld geschrieben und auf das geklickt habe , möchte ich die virtuelle Tastatur ausblenden. Ich gehe davon aus, dass dies ein einfacher Code ist, aber wo finde ich ein Beispiel dafür?
Beim Berühren außerhalb der Tastatur.
Antworten:
Um diesen Wahnsinn zu klären, möchte ich mich zunächst im Namen aller Android-Nutzer für Googles geradezu lächerliche Behandlung der Softtastatur entschuldigen. Der Grund, warum es so viele unterschiedliche Antworten für dieselbe einfache Frage gibt, ist, dass diese API, wie viele andere in Android, schrecklich gestaltet ist. Ich kann mir keinen höflichen Weg vorstellen, es auszudrücken.
Ich möchte die Tastatur verstecken. Ich erwarte, Android mit der folgenden Aussage zu versorgen :
Keyboard.hide()
. Das Ende. Vielen Dank. Aber Android hat ein Problem. Sie müssen die verwendenInputMethodManager
, um die Tastatur auszublenden. OK, gut, dies ist die Android-API für die Tastatur. ABER! Sie benötigen eineContext
, um Zugriff auf das IMM zu erhalten. Jetzt haben wir ein Problem. Möglicherweise möchte ich die Tastatur vor einer statischen oder Utility-Klasse ausblenden, die keine Verwendung hat oder benötigtContext
. oder Und noch viel schlimmer, das IMM erfordert, dass Sie angeben, vor wasView
(oder noch schlimmer, wasWindow
) Sie die Tastatur verstecken möchten.Dies macht das Verstecken der Tastatur so schwierig. Lieber Google: Wenn ich das Rezept für einen Kuchen nachschlage, gibt es keinen
RecipeProvider
auf der Erde, der sich weigert, 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 verbergen, müssen Sie zwei Arten der Identifizierung angeben: a
Context
und entweder aView
oder aWindow
.Ich habe eine statische Dienstprogrammmethode erstellt, die die Aufgabe SEHR solide erledigen kann, vorausgesetzt, Sie rufen sie von einem auf
Activity
.Beachten Sie, dass diese Dienstprogrammmethode NUR funktioniert, wenn sie von einem
Activity
! Die obige Methode ruftgetCurrentFocus
das ZielActivity
auf, um das richtige Fenstertoken abzurufen.Angenommen, Sie möchten die Tastatur vor einem
EditText
gehosteten in einem versteckenDialogFragment
? Sie können die obige Methode dafür nicht verwenden:Dies funktioniert nicht, da Sie einen Verweis auf den
Fragment
Host des Hosts übergebenActivity
, der keine fokussierte Kontrolle hat, solange derFragment
angezeigt wird! Beeindruckend! Um die Tastatur vor Fragmenten zu verbergen, greife ich auf die niedrigere, häufigere und hässlichere Ebene zurück:Im Folgenden finden Sie einige zusätzliche Informationen, die aus mehr Zeitverschwendung bei der Suche nach dieser Lösung gewonnen wurden:
Informationen zu windowSoftInputMode
Es gibt noch einen weiteren Streitpunkt, den Sie beachten sollten. Standardmäßig weist Android dem ersten
EditText
oder fokussierbaren Steuerelement in Ihrem automatisch den anfänglichen Fokus zuActivity
. Daraus folgt natürlich, dass die InputMethod (normalerweise die Softtastatur) auf das Fokusereignis reagiert, indem sie sich selbst zeigt. Wenn daswindowSoftInputMode
Attribut in aufAndroidManifest.xml
gesetzt ist,stateAlwaysHidden
wird die Tastatur angewiesen, diesen automatisch zugewiesenen Anfangsfokus zu ignorieren.Es ist fast unglaublich, dass es nichts zu tun scheint, um zu verhindern, dass sich die Tastatur öffnet, wenn Sie das Steuerelement berühren (es sei denn
focusable="false"
und / oderfocusableInTouchMode="false"
dem Steuerelement zugewiesen sind). Anscheinend gilt die Einstellung windowSoftInputMode nur für automatische Fokusereignisse, nicht für Fokusereignisse, die durch Berührungsereignisse ausgelöst werden.Daher
stateAlwaysHidden
ist in der Tat sehr schlecht benannt. Es sollte vielleicht stattdessen aufgerufenignoreInitialFocus
werden.Hoffe das hilft.
UPDATE: Weitere Möglichkeiten, um ein Fenstertoken zu erhalten
Wenn keine fokussierte Ansicht vorhanden ist (z. B. wenn Sie nur Fragmente geändert haben), gibt es andere Ansichten, die ein nützliches Fenstertoken bereitstellen.
Dies sind Alternativen für den obigen Code.
if (view == null) view = new View(activity);
Diese beziehen sich nicht explizit auf Ihre Aktivität.Innerhalb einer Fragmentklasse:
Gegeben ein Fragment
fragment
als Parameter:Ausgehend von Ihrem Inhaltskörper:
UPDATE 2: Deaktivieren Sie den Fokus, um zu vermeiden, dass die Tastatur erneut angezeigt wird, wenn Sie die App über den Hintergrund öffnen
Fügen Sie diese Zeile am Ende der Methode hinzu:
view.clearFocus();
quelle
Fragment
scheint es, dass Sie verwenden könnengetActivity().getWindow().getDecorView()
Keyboard.hide();
Dienstprogramm wirklich bereitstellenSie können Android zwingen, die virtuelle Tastatur mit der zu verbergen InputMethodManager auszublenden , indem Sie
hideSoftInputFromWindow
das Token des Fensters mit Ihrer fokussierten Ansicht aufrufen und übergeben.Dadurch wird die Tastatur in allen Situationen ausgeblendet. In einigen Fällen möchten Sie
InputMethodManager.HIDE_IMPLICIT_ONLY
als zweiten Parameter übergeben, um sicherzustellen, dass Sie die Tastatur nur dann ausblenden, wenn der Benutzer sie nicht explizit zum Anzeigen gezwungen hat (indem Sie das Menü gedrückt halten).Hinweis: Wenn Sie dies in Kotlin tun möchten, verwenden Sie:
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
Kotlin-Syntax
quelle
editText.clearFocus()
dannInputMethodManager.HIDE_IMPLICIT_ONLY
sogar am4.1
View focused = getCurrentFocus()
zu bekommen , was ist definitiv die aktuell fokussierte Ansicht, rufenfocused.clearFocus()
, und danninputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)
(mit klaren Flags).Ebenfalls nützlich zum Ausblenden der Softtastatur ist:
Dies kann verwendet werden, um die Softtastatur zu unterdrücken, bis der Benutzer die editText-Ansicht tatsächlich berührt.
quelle
Ich habe noch eine Lösung, um die Tastatur auszublenden:
Hier
HIDE_IMPLICIT_ONLY
an der Position vonshowFlag
und0
an der Position von passierenhiddenFlag
. Die weiche Tastatur wird gewaltsam geschlossen.quelle
Meiers Lösung funktioniert auch bei mir. In meinem Fall ist die oberste Ebene meiner App ein tabHost und ich möchte das Schlüsselwort beim Wechseln der Tabs ausblenden. Ich erhalte das Fenstertoken aus der tabHost-Ansicht.
quelle
Bitte versuchen Sie diesen Code unten in
onCreate()
quelle
editView.setInputType(InputType.TYPE_NULL);
Update: Ich weiß nicht, warum diese Lösung nicht mehr funktioniert (ich habe sie gerade auf Android 23 getestet). Bitte verwenden Sie stattdessen die Lösung von Saurabh Pareek . Hier ist es:
Alte Antwort:
quelle
I don't know why this solution is not work any more
- weil es Android ist , wird sich alles ändern können, vielleicht teilweise von schlechtem Design ... Wir schreiben nachlässig, dann streichen wir alles aus und schreiben alles neu.quelle
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
.input.setInputType(0);
aus diesem Code entfernt. Es änderte ein Tastaturverhalten undinputType
für dieEditText
.Wenn alle anderen Antworten hier nicht so funktionieren, wie Sie es möchten, gibt es eine andere Möglichkeit, die Tastatur manuell zu steuern.
Erstellen Sie eine Funktion, mit der einige der
EditText
Eigenschaften verwaltet werden:Stellen
EditText
Sie dann sicher, dass onFocus von Ihnen die Tastatur öffnet / schließt:Wenn Sie jetzt die Tastatur manuell öffnen möchten, rufen Sie Folgendes auf:
Und zum Abschluss des Anrufs:
quelle
Saurabh Pareek hat bisher die beste Antwort.
Könnte aber auch die richtigen Flags verwenden.
Beispiel für eine echte Verwendung
quelle
fragment.getActivity().getSystemService();
Durch diese Suche habe ich hier eine Antwort gefunden, die für mich funktioniert
quelle
Die kurze Antwort
OnClick
Rufen Sie in Ihrem HöreronEditorAction
dasEditText
mit anIME_ACTION_DONE
Der Drilldown
Ich bin der Meinung, dass diese Methode besser, einfacher und besser auf das Designmuster von Android abgestimmt ist. In dem einfachen Beispiel oben (und normalerweise in den meisten Fällen) haben Sie einen
EditText
, der Fokus hatte / hatte, und es war auch normalerweise derjenige, der die Tastatur zuerst aufrief (es ist definitiv in der Lage, sie in vielen aufzurufen häufige Szenarien). In derselben Art und Weise, es sollte derjenige sein , um die Tastatur freizugeben, in der Regel , dass durch eine durchgeführt werdenImeAction
. Sehen Sie nur, wie sich einEditText
withandroid:imeOptions="actionDone"
verhält. Sie möchten dasselbe Verhalten mit denselben Mitteln erreichen.Überprüfen Sie diese Antwort
quelle
Das sollte funktionieren:
quelle
hide()
undshow()
Methoden ergänzen , um mehr Kontrolle darüber zu haben, wann sie angezeigt werden soll und wann nicht. Funktioniert für mich, ich habe es auch getan :) Ich werde Beispiel bearbeitenKeyBoard.toggle(fragment.getActivity())
Fragment
, wie einen Kommentar. Erfahren Sie bitte, wie man Methoden anwendet, und kommen Sie dann zurück. Sie verwechseln Leute mit Ihren dummen AntwortenIch verwende eine benutzerdefinierte Tastatur, um eine Hex-Nummer einzugeben, damit die IMM-Tastatur nicht angezeigt wird ...
In v3.2.4_r1
setSoftInputShownOnFocus(boolean show)
wurde hinzugefügt, um das Wetter zu steuern oder die Tastatur nicht anzuzeigen, wenn eine Textansicht den Fokus erhält, aber sie ist immer noch verborgen, sodass die Reflexion verwendet werden muss:Bei älteren Versionen habe ich mit a sehr gute Ergebnisse erzielt (aber alles andere als perfekt)
OnGlobalLayoutListener
, die mit Hilfe von a hinzugefügt wurdenViewTreeObserver
aus meiner Stammansicht und dann überprüft, ob die Tastatur wie folgt angezeigt wird:Diese letzte Lösung zeigt möglicherweise die Tastatur für den Bruchteil einer Sekunde an und führt zu Problemen mit den Auswahlgriffen.
Wenn die Tastatur im Vollbildmodus angezeigt wird, wird onGlobalLayout nicht aufgerufen. Um dies zu vermeiden, verwenden Sie TextView # setImeOptions (int) oder in der TextView-XML-Deklaration:
Update: Ich habe gerade herausgefunden, welche Dialoge verwendet werden, um die Tastatur niemals anzuzeigen, und funktioniert in allen Versionen:
quelle
quelle
Ich habe mehr als zwei Tage damit verbracht, alle im Thread veröffentlichten Lösungen durchzuarbeiten, und festgestellt, dass sie auf die eine oder andere Weise fehlen. Meine genaue Anforderung ist eine Schaltfläche, mit der die Bildschirmtastatur mit 100% iger Zuverlässigkeit ein- oder ausgeblendet wird. Wenn sich die Tastatur in ihrem verborgenen Zustand befindet, sollte sie nicht erneut angezeigt werden, unabhängig davon, auf welche Eingabefelder der Benutzer klickt. Im sichtbaren Zustand sollte die Tastatur nicht verschwinden, egal auf welche Schaltflächen der Benutzer klickt. Dies muss unter Android 2.2+ bis hin zu den neuesten Geräten funktionieren.
Sie können eine funktionierende Implementierung davon in meiner App Clean RPN sehen .
Nach dem Testen vieler der vorgeschlagenen Antworten auf verschiedenen Handys (einschließlich Froyo- und Lebkuchengeräten) stellte sich heraus, dass Android-Apps zuverlässig:
Für mich reicht es nicht aus, die Tastatur vorübergehend zu verstecken. Auf einigen Geräten wird es wieder angezeigt, sobald ein neues Textfeld fokussiert wird. Da meine App mehrere Textfelder auf einer Seite verwendet, wird beim Fokussieren eines neuen Textfelds die ausgeblendete Tastatur wieder angezeigt.
Leider funktionieren die Punkte 2 und 3 in der Liste nur dann zuverlässig, wenn eine Aktivität gestartet wird. Sobald die Aktivität sichtbar geworden ist, können Sie die Tastatur nicht mehr dauerhaft ein- oder ausblenden. Der Trick besteht darin, Ihre Aktivität tatsächlich neu zu starten, wenn der Benutzer die Umschalttaste der Tastatur drückt. Wenn der Benutzer in meiner App auf die Umschalttaste drückt, wird der folgende Code ausgeführt:
Dadurch wird der Status der aktuellen Aktivität in einem Bundle gespeichert. Anschließend wird die Aktivität gestartet und durchläuft einen Booleschen Wert, der angibt, ob die Tastatur angezeigt oder ausgeblendet werden soll.
Innerhalb der onCreate-Methode wird der folgende Code ausgeführt:
Wenn die Soft-Tastatur angezeigt werden soll, wird der InputMethodManager angewiesen, die Tastatur anzuzeigen, und das Fenster wird angewiesen, die Soft-Eingabe immer sichtbar zu machen. Wenn die Softtastatur ausgeblendet werden soll, wird WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM festgelegt.
Dieser Ansatz funktioniert zuverlässig auf allen Geräten, auf denen ich getestet habe - von einem 4 Jahre alten HTC-Telefon mit Android 2.2 bis zu einem Nexus 7 mit 4.2.2. Der einzige Nachteil bei diesem Ansatz ist, dass Sie vorsichtig mit der Zurück-Taste umgehen müssen. Da meine App im Wesentlichen nur einen Bildschirm hat (es ist ein Taschenrechner), kann ich onBackPressed () überschreiben und zum Startbildschirm des Geräts zurückkehren.
quelle
Alternativ zu dieser Allround-Lösung können Sie die Softtastatur verwenden , wenn Sie sie von einem beliebigen Ort aus schließen möchten, ohne auf das Feld (EditText) zu verweisen, das zum Öffnen der Tastatur verwendet wurde, dies aber dennoch tun möchten, wenn das Feld fokussiert ist dies (aus einer Aktivität):
quelle
Dank dieser SO-Antwort habe ich Folgendes abgeleitet, was in meinem Fall beim Scrollen durch die Fragmente eines ViewPagers gut funktioniert ...
quelle
Die obigen Antworten funktionieren für verschiedene Szenarien. Wenn Sie jedoch die Tastatur in einer Ansicht ausblenden möchten und Schwierigkeiten haben, den richtigen Kontext zu finden, versuchen Sie Folgendes:
und um den Kontext zu bekommen, holen Sie ihn vom Konstruktor :)
quelle
Wenn Sie die Softtastatur während eines Geräte- oder Funktionstests schließen möchten, können Sie dies tun, indem Sie in Ihrem Test auf die Schaltfläche "Zurück" klicken:
Ich habe "Zurück" in Anführungszeichen gesetzt, da das oben Gesagte nicht
onBackPressed()
für die betreffende Aktivität ausgelöst wird . Es schließt nur die Tastatur.Stellen Sie sicher, dass Sie eine kurze Pause einlegen, bevor Sie fortfahren, da das Schließen der Zurück-Taste eine Weile dauert, sodass nachfolgende Klicks auf Ansichten usw. erst nach einer kurzen Pause registriert werden (1 Sekunde ist lang genug ime) ).
quelle
So geht's in Mono für Android (AKA MonoDroid)
quelle
searchbox
in dem Ausschnitt?Dies funktionierte für mich bei all dem bizarren Tastaturverhalten
quelle
Fügen Sie Ihrer Aktivität
android:windowSoftInputMode="stateHidden"
in der Manifest-Datei hinzu. Beispiel:quelle
Einfache und benutzerfreundliche Methode, rufen Sie einfach hideKeyboardFrom (YourActivity.this) auf. Tastatur ausblenden
quelle
Verwenden Sie einfach diesen optimierten Code in Ihrer Aktivität:
quelle
nach diesem Aufruf von onTouchListener:
quelle
benutze das
quelle
Für meinen Fall habe ich eine Suchansicht in der Aktionsleiste verwendet. Nachdem ein Benutzer eine Suche durchgeführt hat, wird die Tastatur wieder geöffnet.
Bei Verwendung des InputMethodManager wurde die Tastatur nicht geschlossen. Ich musste ClearFocus löschen und die Fokussierbarkeit der Suchansicht auf false setzen:
quelle
clearFocus()
in den Android-API-Seiten, daher hat dies bei mir nicht funktioniert, bei einer anderen Lösung jedoch (siehe meine Antwort unten).Ich habe den Fall, in dem sich mein
EditText
auch in einem befinden kannAlertDialog
, daher sollte die Tastatur beim Entlassen geschlossen werden. Der folgende Code scheint überall zu funktionieren:quelle
Ich habe fast alle diese Antworten ausprobiert, ich hatte einige zufällige Probleme, insbesondere mit der Samsung Galaxy S5.
Am Ende zwinge ich die Show und verstecke mich, und es funktioniert perfekt:
quelle