Ich muss eine sehr einfache Sache tun - herausfinden, ob die Software-Tastatur angezeigt wird. Ist das in Android möglich?
516
Ich muss eine sehr einfache Sache tun - herausfinden, ob die Software-Tastatur angezeigt wird. Ist das in Android möglich?
Antworten:
NEUE ANTWORT hinzugefügt am 25. Januar 2012
Seit ich die folgende Antwort geschrieben habe, hat mich jemand auf die Existenz von ViewTreeObserver und Freunden hingewiesen , APIs, die seit Version 1 im SDK lauern.
Anstatt einen benutzerdefinierten
@+id/activityRoot
Layouttyp zu benötigen, besteht eine viel einfachere Lösung darin, der Stammansicht Ihrer Aktivität eine bekannte ID zuzuweisen , z. B. einen GlobalLayoutListener in den ViewTreeObserver einzubinden und von dort aus den Größenunterschied zwischen dem Ansichtsstamm Ihrer Aktivität und der Fenstergröße zu berechnen:Verwenden eines Dienstprogramms wie:
Einfach!
Hinweis: Ihre Anwendung muss dieses Flag in Android Manifest setzen, da
android:windowSoftInputMode="adjustResize"
sonst die oben genannte Lösung nicht funktioniert.URSPRÜNGLICHE ANTWORT
Ja, es ist möglich, aber es ist viel schwieriger als es sein sollte.
Wenn ich mich darum kümmern muss, wann die Tastatur erscheint und verschwindet (was ziemlich oft der Fall ist), passe ich meine Layoutklasse der obersten Ebene in eine Klasse an, die überschreibt
onMeasure()
. Die Grundlogik lautet: Wenn das Layout deutlich weniger als die Gesamtfläche des Fensters ausfüllt, wird wahrscheinlich eine Softtastatur angezeigt.Dann in Ihrer Aktivitätsklasse ...
quelle
((ViewGroup) findViewById(android.R.id.content)).getChildAt(0)
android.R.id.content
) versuchen , können Sie sicherer sagen, dassSystem
die Entität anstelle Ihrer Anwendung die Höhe ändert. Es wäre viel sicherer für das Android-Team, uns eine Pause zu gönnen und uns zumindest grundlegende Dinge über die SoftKeyboard-Eingabe mitzuteilen.heightDiff
immer die Höhe der Aktionsleiste angegeben wird. In der neuen Antwort, die beim Testen ignoriert wurde, ob diese Höhe größer als eine Konstante ist, aber 100 Pixel für xxhdpi-Geräte wie das Nexus 4 nicht ausreichen, sollten Sie diesen Wert in DPs konvertieren, wenn Sie diese hackige Arbeit wirklich verwenden möchten. um.Hoffentlich hilft das jemandem.
Die neue Antwort von Reuben Scratton ist großartig und sehr effizient, funktioniert aber nur, wenn Sie den windowSoftInputMode auf adjustResize einstellen. Wenn Sie es auf adjustPan einstellen, ist es immer noch nicht möglich zu erkennen, ob die Tastatur mit seinem Code-Snippet sichtbar ist oder nicht. Um dies zu umgehen, habe ich diese winzige Änderung am obigen Code vorgenommen.
quelle
TwoDScrollerView
zu ermitteln , die stackoverflow.com/a/5224088/530513 ähnelt, obwohl auch gezoomt wurde . Das Kind war kein einfaches,ImageView
sondern ein benutzerdefiniertes Layout (erweitertRelativeLayout
), konnte jedoch die Tastatur mit der empfohlenen Lösung trotz der Einstellung nicht erkennenandroid:windowSoftInputMode="adjustResize"
. Vielen Dank!ActionBar
undActionBarSherlock
. Vielen Dank! Übrigens gibt es eine Methoder.height()
:)heightDiff > root.getRootView().getHeight() / 4
ist ein guter Wert für die Arbeit mit hochauflösenden Geräten. 100px ist zu kurz. in Nexus 5 mit 1080 x 1920 res, 1920 - (996-75)>? 100 = 999 1920 - (1776-75)>? 100 = 219 // Tastatur ist in Galaxie s2 mit 480x800 res, 800 - (800-38)>? 100 = 38 800 - (410-38)>? 100 = 428 // Tastatur ist aktiv, die magische Zahl 100px ist nicht gut genug.In Bezug auf den Computer war es für immer, aber diese Frage ist immer noch unglaublich relevant!
Also habe ich die obigen Antworten genommen und sie ein bisschen kombiniert und verfeinert ...
Funktioniert bei mir :)
HINWEIS: Wenn Sie feststellen, dass das DefaultKeyboardDP nicht zu Ihrem Gerät passt, spielen Sie mit dem Wert und geben Sie einen Kommentar ab, damit jeder weiß, was der Wert sein soll. Schließlich erhalten wir den richtigen Wert für alle Geräte!
Weitere Informationen finden Sie in der Implementierung auf Cyborg
quelle
Entschuldigen Sie die späte Antwort, aber ich hatte eine kleine Hilfsklasse erstellt, um Open / Close-Ereignisse mit Benachrichtigungen von Hörern und anderen nützlichen Dingen zu behandeln. Vielleicht würde es jemand hilfreich finden:
Anwendungsbeispiel:
quelle
getLastKeyboardHeightInPx()
nicht die Höhe dieser Zeile enthält. Kennen Sie eine Möglichkeit, dies ebenfalls zu berücksichtigen?Einige Verbesserungen, um zu vermeiden, dass die Sichtbarkeit von Softtastaturen auf Geräten mit hoher Dichte falsch erkannt wird:
Der Schwellenwert für den Höhenunterschied sollte als 128 dp und nicht als 128 Pixel definiert werden .
Weitere Informationen finden Sie im Google-Designdokument zu Metriken und Raster . 48 dp sind eine komfortable Größe für Touch-Objekte und 32 dp für Schaltflächen. Die generische Softtastatur sollte 4 Reihen von Tasten enthalten, daher sollte die minimale Tastaturhöhe: 32 dp * 4 = 128 dp betragen. Dies bedeutet, dass die Schwellengröße durch Multiplikation der Gerätedichte auf Pixel übertragen werden sollte. Für xxxhdpi-Geräte (Dichte 4) sollte der Schwellenwert für die Höhe der Softtastatur 128 * 4 = 512 Pixel betragen.
Höhenunterschied zwischen der Stammansicht und ihrem sichtbaren Bereich:
Höhe der Stammansicht - Höhe der Statusleiste - Höhe des sichtbaren Rahmens = Höhe der Stammansicht - Boden des sichtbaren Rahmens, da die Höhe der Statusleiste der Oberseite des sichtbaren Rahmens der Stammansicht entspricht.
quelle
Ich habe ein wenig Zeit gebraucht, um das herauszufinden ... Ich habe einige CastExceptions ausgeführt, aber herausgefunden, dass Sie Ihr LinearLayout in der layout.xml durch den Namen der Klasse ersetzen können.
So was:
Auf diese Weise stoßen Sie nicht auf Besetzungsprobleme.
... und wenn Sie dies nicht auf jeder Seite tun möchten, empfehle ich Ihnen, "MasterPage in Android" zu verwenden. Siehe den Link hier: http://jnastase.alner.net/archive/2011/01/08/ldquomaster-pagesrdquo-in-android.aspx
quelle
Das Überprüfen der Höhe von Elementen ist nicht zuverlässig, da einige Tastaturen wie WifiKeyboard keine Höhe haben.
Stattdessen können Sie das Rückrufergebnis von showSoftInput () und hideSoftInput () verwenden, um den Status der Tastatur zu überprüfen. Alle Details und Beispielcode unter
https://rogerkeays.com/how-to-check-if-the-software-keyboard-is-shown-in-android
quelle
Die Idee ist, wenn Sie Ihre Tastatur ausblenden und gleichzeitig den Status der weichen Eingabe überprüfen müssen, verwenden Sie die folgende Lösung:
Diese Methode gibt true zurück, wenn die Tastatur vor dem Ausblenden angezeigt wurde.
quelle
Ich fand, dass eine Kombination der Methode von @ Reuben_Scratton mit der Methode von @ Yogesh am besten zu funktionieren scheint. Die Kombination ihrer Methoden würde ungefähr so ergeben:
quelle
Sie können das Verstecken von Softkeyboards mithilfe der Dekoransicht der Aktivität beobachten.
quelle
Anstatt die Differenzcodierung anzunehmen, habe ich so etwas gemacht, da ich in meiner Anwendung keine Menüoptionen hatte.
quelle
Es gibt auch eine Lösung mit Systemeinfügungen, die jedoch nur mit
API >= 21
(Android L
) funktioniert . Angenommen, Sie habenBottomNavigationView
, welches Kind von ist,LinearLayout
und Sie müssen es ausblenden, wenn die Tastatur angezeigt wird:Alles was Sie tun müssen, ist Folgendes zu erweitern
LinearLayout
:Die Idee ist, dass bei der Anzeige der Tastatur die Systemeinfügungen mit ziemlich großem
.bottom
Wert geändert werden.quelle
Es gibt eine versteckte Methode, die dabei helfen kann
InputMethodManager.getInputMethodWindowVisibleHeight
. Aber ich weiß nicht, warum es versteckt ist.quelle
Keine dieser Lösungen funktioniert für Lollipop so wie sie ist. In Lollipop
activityRootView.getRootView().getHeight()
enthält die Höhe der Schaltflächenleiste, während das Messen der Ansicht nicht. Ich habe die beste / einfachste Lösung oben für die Arbeit mit Lollipop angepasst.quelle
Ich bin gerade auf einen Fehler gestoßen, als ich die meisten der oben genannten Lösungen verwendet habe, die das Hinzufügen einer festen Nummer vorschlagen.
S4 hat eine hohe Auflösung, was dazu führte, dass die Höhe der Navigationsleiste 100 Pixel betrug. Daher dachte meine App, dass die Tastatur ständig geöffnet ist.
Angesichts der neuen hochauflösenden Telefone halte ich die Verwendung eines fest codierten Werts auf lange Sicht für keine gute Idee.
Ein besserer Ansatz, den ich nach einigen Tests auf verschiedenen Bildschirmen und Geräten gefunden habe, war die Verwendung des Prozentsatzes. Ermitteln Sie den Unterschied zwischen decorView und Ihrem App-Inhalt und überprüfen Sie anschließend, wie viel Prozent dieses Unterschieds ausmachen. Nach den Statistiken, die ich erhalten habe, nimmt die meiste Navigationsleiste (unabhängig von Größe, Auflösung usw.) zwischen 3% und 5% des Bildschirms ein. Wenn die Tastatur geöffnet ist, nimmt sie zwischen 47% und 55% des Bildschirms ein.
Als Fazit bestand meine Lösung darin, zu überprüfen, ob der Unterschied mehr als 10% beträgt, dann gehe ich davon aus, dass die Tastatur offen ist.
quelle
Ich habe eine kleine Variante von Reubans Antwort verwendet, die sich unter bestimmten Umständen als hilfreicher erwies, insbesondere bei hochauflösenden Geräten.
quelle
R.id.activityRoot
, können Sie einfachandroid.R.id.content
genau das verwenden , was Sie benötigen.In Bezug auf den Computer war es für immer, aber diese Frage ist immer noch unglaublich relevant! Also habe ich die obigen Antworten genommen und sie ein bisschen kombiniert und verfeinert ...
Für mich geht das.
quelle
Versuche dies:
quelle
Meine Antwort ist im Grunde die gleiche wie die von Kachi, aber ich habe sie in eine nette Hilfsklasse eingepackt, um die Art und Weise zu bereinigen, wie sie in meiner App verwendet wird.
Sie können dies verwenden, um Tastaturänderungen überall in der App wie folgt zu erkennen:
Hinweis: Verwenden Sie nur einen der "Register" -Aufrufe. Sie arbeiten alle gleich und sind nur zur Vereinfachung da
quelle
Sie können dies versuchen, arbeiten Sie gut für mich:
quelle
Ich hatte Schwierigkeiten, den Tastaturstatus beizubehalten, wenn ich die Ausrichtung von Fragmenten in einem Viewpager änderte. Ich bin mir nicht sicher warum, aber es scheint nur wackelig zu sein und verhält sich anders als eine Standardaktivität.
Um den Tastaturstatus in diesem Fall beizubehalten, sollten Sie zuerst
android:windowSoftInputMode = "stateUnchanged"
Ihren hinzufügenAndroidManifest.xml
. Möglicherweise stellen Sie jedoch fest, dass dies nicht das gesamte Problem löst. Die Tastatur wurde für mich nicht geöffnet, wenn sie zuvor vor einer Änderung der Ausrichtung geöffnet wurde. In allen anderen Fällen schien das Verhalten korrekt zu sein.Dann müssen wir eine der hier genannten Lösungen implementieren. Das sauberste, das ich gefunden habe, war das von George Maisuradze - verwenden Sie den booleschen Rückruf von hideSoftInputFromWindow:
Ich habe diesen Wert in der
onSaveInstanceState
Methode meines Fragments gespeichert und abgerufenonCreate
. Dann zeigte ich gewaltsam die Tastatur,onCreateView
wenn sie einen Wert von hattetrue
(sie gibt true zurück, wenn die Tastatur sichtbar ist, bevor sie vor der Zerstörung des Fragments tatsächlich ausgeblendet wurde).quelle
Hier ist meine Lösung, und es funktioniert. Anstatt nach der Pixelgröße zu suchen, überprüfen Sie einfach, ob sich die Höhe der Inhaltsansicht geändert hat oder nicht:
quelle
Mach keinen harten Code. Am besten müssen Sie die Größe Ihrer Ansichten ändern, während Sie sich mit KeyBord Show auf EditText konzentrieren. Sie können dies tun, indem Sie der Manifest-Datei mithilfe des folgenden Codes die Eigenschaft zum Ändern der Größe für Aktivitäten hinzufügen.
android:windowSoftInputMode="adjustResize"
quelle
Es gibt eine direkte Methode, um dies herauszufinden. Außerdem sind keine Layoutänderungen erforderlich.
Es funktioniert also auch im immersiven Vollbildmodus.
Der Trick besteht darin, dass Sie versuchen, die Softtastatur auszublenden oder anzuzeigen und das Ergebnis dieses Versuchs zu erfassen.
Keine Panik, dies zeigt oder versteckt die Tastatur nicht wirklich. Wir fragen nur nach dem Staat.
Um auf dem neuesten Stand zu bleiben, können Sie den Vorgang einfach, z. B. alle 200 Millisekunden, mit einem Handler wiederholen.
Eine Implementierung finden Sie hier: https://stackoverflow.com/a/27567074/2525452
quelle
Ich denke, diese Methode wird Ihnen helfen herauszufinden, ob Keybord sichtbar ist oder nicht.
quelle
Die neue Antwort von Reuben Scratton (Berechnung des HeightDiff
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
) funktioniert nicht in der Aktivität, wenn Sie den durchscheinenden Statusleistenmodus einstellen.Wenn Sie eine durchscheinende Statusleiste verwenden,
activityRootView.getHeight()
ändert sich das Wetter nie, wenn die Softtastatur sichtbar ist. Es wird immer die Höhe der Aktivität und die Statusleiste zurückgegeben.Zum Beispiel, Nexus 4, Android 5.0.1,
android:windowTranslucentStatus
auf true gesetzt, wird es 1184 für immer zurückgeben, selbst die ime haben opend. Wenn Sie einstellenandroid:windowTranslucentStatus
auf false setzen, wird die Höhe korrekt zurückgegeben. Wenn ich unsichtbar bin, wird 1134 zurückgegeben (ohne die Statusleiste). Schließen Sie das IM, es gibt möglicherweise 5xx zurück (abhängig von der Größe des Ime).Ich weiß nicht, ob dies ein Fehler ist. Ich habe 4.4.4 und 5.0.1 ausprobiert. Das Ergebnis ist dasselbe.
Bis jetzt, als zweithäufigste Antwort, ist Kachis Lösung der sicherste Weg, um die Höhe von ime zu berechnen. Hier ist eine Kopie:
quelle
Eine Methode, die keinen LayoutListener benötigt
In meinem Fall möchte ich den Status der Tastatur speichern, bevor ich mein Fragment ersetze. Ich rufe die Methode hideSoftInputFromWindow von auf
onSaveInstanceState
, die die Tastatur schließt und mir zurückgibt, ob die Tastatur sichtbar war oder nicht.Diese Methode ist unkompliziert, kann jedoch den Status Ihrer Tastatur ändern.
quelle
Ich weiß, dass dies ein alter Beitrag ist, aber ich denke, dies ist der einfachste Ansatz, den ich kenne, und mein Testgerät ist Nexus 5. Ich habe es auf anderen Geräten nicht ausprobiert. Hoffe, dass andere ihren Ansatz teilen, wenn sie meinen Code nicht gut finden :)
imm.hideSoftInputFromWindow gibt einen Booleschen Wert zurück.
Vielen Dank,
quelle
Mit der obigen Funktion überprüfe ich, ob eine Tastatur sichtbar ist. Wenn ja, dann schließe ich es.
Unten sehen Sie die beiden erforderlichen Methoden.
Definieren Sie zunächst die Höhe des bearbeitbaren Fensters in onCreate.
Fügen Sie dann eine boolesche Methode hinzu, die die Fensterhöhe an dieser Instanz abruft. Wenn es nicht mit dem Original übereinstimmt (vorausgesetzt, Sie ändern es unterwegs nicht ...), ist die Tastatur geöffnet.
Frotz!
quelle
Ich weiß, wie genau Sie feststellen können, ob die Tastatur versteckt ist oder nicht.
Dies funktioniert für Tablets. Wenn die Navigationsleiste horizontal angezeigt wird.
quelle