Gibt es in Android eine Möglichkeit zu erkennen, ob die Software-Tastatur (auch "Soft" genannt) auf dem Bildschirm sichtbar ist?
android
keyboard
android-softkeyboard
andreea
quelle
quelle
Antworten:
Es gibt keinen direkten Weg - siehe http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a, wo Dianne Hackborn vom Android-Team geantwortet hat. Sie können es jedoch indirekt erkennen, indem Sie überprüfen, ob sich die Fenstergröße in #onMeasure geändert hat. Siehe So überprüfen Sie die Sichtbarkeit der Softwaretastatur in Android .
quelle
Das funktioniert bei mir. Vielleicht ist dies immer der beste Weg für alle Versionen .
Es wäre effektiv, eine Eigenschaft der Tastatursichtbarkeit festzulegen und diese Änderungen verzögert zu beobachten, da die onGlobalLayout-Methode viele Male aufgerufen wird. Es ist auch gut, die Gerätedrehung zu überprüfen und
windowSoftInputMode
nichtadjustNothing
.quelle
contentView
deklariert?Versuche dies:
quelle
Ich habe eine einfache Klasse erstellt, die dafür verwendet werden kann: https://github.com/ravindu1024/android-keyboardlistener . Kopieren Sie es einfach in Ihr Projekt und verwenden Sie es wie folgt:
quelle
Sehr leicht
1. Fügen Sie die ID in Ihre Stammansicht ein
rootView
ist in diesem Fall nur eine Ansicht, die auf meine Stammansicht verweistrelative layout
: a :2. Initialisieren Sie Ihre Stammansicht in Ihrer Aktivität:
RelativeLayout rootView = (RelativeLayout) findViewById(R.id.addresses_confirm_root_view);
3. Ermitteln Sie mithilfe von, ob die Tastatur geöffnet oder geschlossen ist
getViewTreeObserver()
quelle
1
. Ganz gleich. Nur dies muss kleiner sein als die tatsächliche Länge der TastaturIch habe dies als Grundlage verwendet: http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
Dann schrieb diese Methode:
Sie können dies dann verwenden, um alle Felder (EditText, AutoCompleteTextView usw.) zu testen, die möglicherweise ein Softkeyboard geöffnet haben:
Zwar keine ideale Lösung, aber es erledigt den Job.
quelle
Sie können das Rückrufergebnis von showSoftInput () und hideSoftInput () verwenden, um den Status der Tastatur zu überprüfen. Alle Details und Beispielcode unter
http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
quelle
Sie können sich auf diese Antwort beziehen - https://stackoverflow.com/a/24105062/3629912
Es hat jedes Mal bei mir funktioniert.
Es wird true zurückgegeben, wenn die Softwaretastatur sichtbar ist.
quelle
Nach einer langen Zeit des Herumspielens mit AccessibilityServices, Fenstereinfügungen, Bildschirmhöhenerkennung usw. habe ich einen Weg gefunden, dies zu tun.
Haftungsausschluss: In Android wird eine versteckte Methode verwendet, was bedeutet, dass sie möglicherweise nicht konsistent ist. Bei meinen Tests scheint es jedoch zu funktionieren.
Die Methode ist InputMethodManager # getInputMethodWindowVisibleHeight () und existiert seit Lollipop (5.0).
Ein Aufruf, der die Höhe der aktuellen Tastatur in Pixel zurückgibt. Theoretisch sollte eine Tastatur nicht 0 Pixel groß sein, daher habe ich eine einfache Höhenprüfung durchgeführt (in Kotlin):
Ich verwende die Android Hidden API , um Reflexionen zu vermeiden, wenn ich versteckte Methoden aufrufe (das mache ich häufig für die von mir entwickelten Apps, bei denen es sich hauptsächlich um Hacky / Tuner-Apps handelt), aber dies sollte auch mit Reflexionen möglich sein:
quelle
Dies war für die Anforderungen, die ich brauchte, viel weniger kompliziert. Hoffe das könnte helfen:
Auf der Hauptaktivität:
Der standardmäßige primitive boolesche Wert für mKeyboardStatus wird auf false initialisiert .
Überprüfen Sie dann den Wert wie folgt und führen Sie gegebenenfalls eine Aktion aus:
quelle
Dies sollte funktionieren, wenn Sie den Tastaturstatus überprüfen müssen:
Wobei
UiUtils.KEYBOARD_VISIBLE_THRESHOLD_DP
= 100 und dip () eine Anko-Funktion ist, die dpToPx konvertiert:quelle
Dazu habe ich einen GlobalLayoutListener wie folgt festgelegt:
quelle
Versuchen Sie diesen Code, es funktioniert wirklich, wenn KeyboardShown angezeigt wird, dann gibt diese Funktion den wahren Wert zurück ....
quelle
In meinem Fall hatte ich nur eine
EditText
in meinem Layout zu verwalten, also kam ich auf diese Lösung. Es funktioniert gut, im Grunde ist es eine benutzerdefinierte Funktion,EditText
die auf den Fokus wartet und eine lokale Sendung sendet, wenn sich der Fokus ändert oder wenn die Zurück / Fertig-Taste gedrückt wird. Arbeiten Sie einen Dummy platzieren müssenView
mit in Ihrem Layoutandroid:focusable="true"
undandroid:focusableInTouchMode="true"
weil , wenn Sie anrufen wirdclearFocus()
der Fokus auf die erste fokussierbare Ansicht neu zugewiesen werden. Beispiel für eine Dummy-Ansicht:Zusätzliche Infos
Die Lösung, die den Unterschied bei Layoutänderungen erkennt, funktioniert nicht sehr gut, da sie stark von der Bildschirmdichte abhängt, da 100 Pixel in einem bestimmten Gerät sehr viel sein können und in einigen anderen Geräten nichts Falsches. Auch verschiedene Anbieter haben unterschiedliche Tastaturen.
quelle
In Android können Sie über ADB-Shell erkennen. Ich habe diese Methode geschrieben und angewendet:
quelle
quelle
Die Antwort von @iWantScala ist großartig, aber nicht für mich zu arbeiten hat
rootView.getRootView().getHeight()
immer den gleichen WertEine Möglichkeit besteht darin, zwei Vars zu definieren
globalen Listener hinzufügen
dann überprüfe
funktioniert gut
quelle
Es gibt jetzt endlich einen direkten Weg von Android R basierend auf Kotlin.
quelle
Ich hatte ein ähnliches Problem. Ich musste auf die Eingabetaste auf dem Bildschirm reagieren (die die Tastatur verbarg). In diesem Fall können Sie die OnEditorAction der Textansicht abonnieren, mit der die Tastatur geöffnet wurde. Wenn Sie mehrere bearbeitbare Felder haben, abonnieren Sie alle.
In Ihrer Aktivität haben Sie die volle Kontrolle über die Tastatur, sodass Sie zu keinem Zeitpunkt das Problem haben, ob die Tastatur geöffnet ist oder nicht, wenn Sie alle Öffnungs- und Schließereignisse abhören.
quelle
Es gibt eine direkte Methode, um dies herauszufinden. Die Layoutänderungen sind nicht erforderlich.
So funktioniert es auch im immersiven Vollbildmodus.
Leider funktioniert es nicht auf allen Geräten. Sie müssen es also mit Ihren Geräten testen.
Der Trick besteht darin, dass Sie versuchen, die Softtastatur auszublenden oder anzuzeigen und das Ergebnis dieses Versuchs zu erfassen.
Wenn es richtig funktioniert, wird die Tastatur nicht wirklich angezeigt oder ausgeblendet. Wir fragen nur nach dem Staat.
Um auf dem neuesten Stand zu bleiben, wiederholen Sie diesen Vorgang einfach, z. B. alle 200 Millisekunden, mit einem Handler.
Die folgende Implementierung führt nur eine einzige Überprüfung durch.
Wenn Sie mehrere Überprüfungen durchführen, sollten Sie alle (_keyboardVisible) -Tests aktivieren.
quelle
Hier ist eine Problemumgehung, um festzustellen, ob das Softkeyboard sichtbar ist.
Einige der gängigen Tastaturen haben bestimmte Schlüsselwörter in ihren Klassennamen:
Überprüfen Sie in ActivityManager.RunningServiceInfo die oben genannten Muster in ClassNames. Außerdem ist clientPackage = android von ActivityManager.RunningServiceInfo angegeben , dass die Tastatur an das System gebunden ist.
Die oben genannten Informationen können kombiniert werden, um herauszufinden, ob eine Softtastatur sichtbar ist.
quelle
Wie Sie vielleicht wissen, ist die Android-Softwaretastatur nur sichtbar, wenn ein mögliches Tippereignis vorliegt. Mit anderen Worten, die Tastatur wird nur sichtbar, wenn EditText fokussiert ist. Das bedeutet, dass Sie mithilfe von OnFocusChangeListener feststellen können , ob die Tastatur sichtbar ist oder nicht .
Jetzt können Sie die Variable isKeyBoardVisible an einer beliebigen Stelle in der Klasse verwenden, um festzustellen , ob die Tastatur geöffnet ist oder nicht. Es hat gut für mich funktioniert.
Hinweis: Dieser Vorgang funktioniert nicht, wenn die Tastatur programmgesteuert mit InputMethodManager geöffnet wird, da dadurch OnFocusChangeListener nicht aufgerufen wird.
quelle
Ich habe die Antwort in Kotlin konvertiert und hoffe, dass dies für Kotlin-Benutzer hilfreich ist.
quelle
Es funktioniert mit adjustNothing-Aktivitätsflag und Lebenszyklusereignisse werden verwendet. Auch bei Kotlin:
Nützliche Methode, um die Ansicht immer über der Tastatur zu behalten
Wo getFullViewBounds
Wo getFullScreenSize
Wo updateMargin
quelle
Ich habe dies wie folgt gemacht, aber es ist nur relevant, wenn Ihr Ziel darin besteht, die Tastatur zu schließen / zu öffnen.
Beispiel schließen: (Überprüfen, ob die Tastatur bereits geschlossen ist, falls nicht - Schließen)
quelle
a verwendet möglicherweise:
quelle
Ich habe Probe geschrieben .
Dieses Repository kann dabei helfen, den Tastaturstatus zu erkennen, ohne davon auszugehen, dass "Tastatur mehr als X Teil des Bildschirms sein sollte".
quelle
Wenn Sie apis für AndroidR in Ihrer App unterstützen, können Sie die folgende Methode verwenden.
Hinweis: Dies ist nur für AndroidR verfügbar und darunter muss die Android-Version einer anderen Antwort folgen, sonst werde ich sie dafür aktualisieren.
quelle