Ich habe eine Activity
wo es 5 EditText
s gibt. Wenn der Benutzer auf die erste klickt EditText
, wird die Softtastatur geöffnet, um einen Wert einzugeben. Ich möchte die View
Sichtbarkeit eines anderen festlegen , Gone
wenn die Softtastatur geöffnet wird und wenn der Benutzer auf die erste klickt EditText
und wenn die Softtastatur von derselben aus geschlossen wirdEditText
die Softtastatur beim Drücken der Zurück-Taste . Dann möchte ich die View
Sichtbarkeit eines anderen auf sichtbar setzen.
Gibt es einen Listener oder Rückruf oder einen Hack, wenn die Softtastatur durch Klicken auf die erste EditText
in Android geöffnet wird ?
trying to detect the virtual keyboard height in Android.
X
und dieY
Position auf / über die Tastatur fallen =>SecurityException
=> dekrementierenY
und erneut versuchen => bis keine Ausnahme ausgelöst wird => Der aktuelleY
Wert ist die Tastaturhöhe. 2. wenn die Tastatur nicht geöffnet ist => neinSecurityException
.SecurityException
geworfen wird => ist die Tastatur geöffnet. Andernfalls ist die Tastatur geschlossen.EditText
nicht andersEditText
. Wie kann ich das unterscheiden?Antworten:
Dies funktioniert nur, wenn
android:windowSoftInputMode
Ihre AktivitätadjustResize
im Manifest festgelegt ist. Sie können einen Layout-Listener verwenden, um festzustellen, ob die Größe des Stammlayouts Ihrer Aktivität über die Tastatur geändert wird.Ich verwende für meine Aktivitäten so etwas wie die folgende Basisklasse:
In der folgenden Beispielaktivität wird dies verwendet, um eine Ansicht auszublenden, wenn die Tastatur angezeigt wird, und um sie erneut anzuzeigen, wenn die Tastatur ausgeblendet ist.
Das XML-Layout:
Und die Aktivität:
quelle
rootLayout = (ViewGroup) findViewById(R.id.rootLayout);
?Ein Kinderspiel mit der fantastischen KeyboardVisibilityEvent-Bibliothek
Credits für Yasuhiro SHIMIZU
quelle
Wie Vikram in den Kommentaren betonte, ist es nur mit einigen hässlichen Hacks möglich festzustellen, ob das Softkeyboard angezeigt wird oder verschwunden ist.
Vielleicht reicht es aus, einen Fokus-Listener auf den Edittext zu setzen :
quelle
setOnFocusChangeListener
Listener aufgerufen, dann drücke ich zurück, dann schließt er die Tastatur und klickt nicht auf andere Ansichten. Jetzt klicke ich wieder auf denselben Edittext, der bereits den Fokus hat. Was passiert dann?onFocusChange()
das nicht aufgerufen wird.Für Aktivität:
Für Fragment:
quelle
android:windowSoftInputMode="adjustResize"
In-Manifest?Jaaps Antwort wird nicht für AppCompatActivity arbeiten. Ermitteln Sie stattdessen die Höhe der Statusleiste und der Navigationsleiste usw. und vergleichen Sie sie mit der Fenstergröße Ihrer App.
Wie so:
quelle
Du kannst es versuchen:
quelle
Sie können meine Rx-Erweiterungsfunktion (Kotlin) verwenden.
Beispiel:
quelle
dip()
undgetScreenHeight()
Der folgende Code funktioniert für mich,
quelle
Wenn Sie können, versuchen Sie, EditText zu erweitern und die Methode 'onKeyPreIme' zu überschreiben.
Wie können Sie es erweitern:
Ich denke, dass die Neuberechnung der Bildschirmhöhe nicht 100% erfolgreich ist, wie bereits erwähnt. Um klar zu sein, wird das Überschreiben von 'onKeyPreIme' bei den Methoden 'Soft Keyboard programmgesteuert ausblenden' nicht aufgerufen. ABER wenn Sie dies irgendwo tun, sollten Sie dort die Logik 'onKeyboardHidden' ausführen und keine umfassenden Lösungen erstellen.
quelle
quelle
setOnFocusChangeListener
Listener aufgerufen, dann drücke ich zurück, dann schließt er die Tastatur und klickt nicht auf andere Ansichten. Jetzt klicke ich wieder auf denselben Edittext, der bereits den Fokus hat. Was passiert dann?onfocus
Hörer nie anruft. Ich schaue nicht nach dem, was Sie vorschlagenVerwenden Sie diese Klasse,
In
Android Manifest
,android:windowSoftInputMode="adjustResize"
ist notwendig.PS - Komplett von hier genommen .
quelle
Für den Fall von
adjustResize
und FragmentActivity akzeptierte Lösung von @Jaap funktioniert bei mir nicht.Hier ist meine Lösung:
quelle
Ein anderer Ansatz wäre zu überprüfen, wann der Benutzer aufgehört hat zu tippen ...
Wenn ein TextEdit im Fokus ist (Benutzer tippt / tippt), können Sie die Ansichten ausblenden (Fokus-Listener).
Verwenden Sie einen Handler + Runnable und einen Textänderungs-Listener, um die Tastatur zu schließen (unabhängig von ihrer Sichtbarkeit) und die Ansichten nach einiger Verzögerung anzuzeigen.
Die Hauptsache, auf die Sie achten sollten, ist die Verzögerung, die Sie verwenden und die vom Inhalt dieser TextEdits abhängt.
quelle
Dieser Code funktioniert sehr gut
Verwenden Sie diese Klasse für die Stammansicht:
}}
und setzen Sie den Tastatur-Listener auf Aktivität oder Fragment:
quelle
Sie können durch zwingende zwei Methoden in Ihrer Aktivität Tastatur Sichtbarkeit behandeln:
onKeyUp()
undonKeyDown()
weitere Informationen in diesem Link: https://developer.android.com/training/keyboard-input/commandsquelle
Leider habe ich kein ausreichend hohes Ansehen, um die Antwort von Jaap van Hengstum zu kommentieren. Aber ich habe ein paar Kommentare von Leuten gelesen, die das Problem haben,
contentViewTop
das immer0
und das istonShowKeyboard(...)
immer genannt wird.Ich hatte das gleiche Problem und fand das Problem heraus, das ich hatte. Ich habe eine
AppCompatActivity
anstelle einer "normalen" verwendetActivity
. In diesem FallWindow.ID_ANDROID_CONTENT
bezieht sich auf einContentFrameLayout
und nicht auf dasFrameLayout
mit dem richtigen Spitzenwert. In meinem Fall war es in Ordnung, den 'normalen' zu verwendenActivity
. Wenn Sie einen anderen Aktivitätstyp verwenden müssen (ich habe gerade den getestetAppCompatActivity
, vielleicht ist es auch ein Problem mit anderen Aktivitätstypen wie demFragmentActivity
), müssen Sie auf den zugreifenFrameLayout
, das heißt ein Vorfahr derContentFrameLayout
.quelle
wenn Tastatur zeigen
ist wahr, sonst verstecken
quelle
Ich habe die akzeptierte Antwort des Jaap ein wenig geändert. In meinem Fall gibt es jedoch nur wenige Annahmen wie:
android:windowSoftInputMode=adjustResize
Die Tastatur wird zu Beginn des App-Starts nicht angezeigt. Außerdem gehe ich davon aus, dass der Bildschirm in Bezug auf die Größe der Eltern übereinstimmt.contentHeight > 0
Durch diese Überprüfung kann ich feststellen, ob der betreffende Bildschirm ausgeblendet oder angezeigt wird, um das Abhören von Tastaturereignissen für diesen bestimmten Bildschirm anzuwenden. Außerdem übergebe ich die Layoutansicht des betreffenden Bildschirms inattachKeyboardListeners(<your layout view here>)
deronCreate()
Methode meiner Hauptaktivität . Jedes Mal, wenn sich die Höhe des betreffenden Bildschirms ändert, speichere ich ihn unterprevContentHeight
Variablen, um später zu überprüfen, ob die Tastatur angezeigt oder ausgeblendet wird.Für mich hat es bisher ziemlich gut geklappt. Ich hoffe, dass es auch für andere funktioniert.
quelle
Die Antwort von "Jaap van Hengstum" funktioniert für mich, aber es ist nicht nötig, "android: windowSoftInputMode" einzustellen, wie er gerade sagte!
Ich habe es kleiner gemacht (es erkennt jetzt nur, was ich will, eigentlich ein Ereignis beim Ein- und Ausblenden der Tastatur):
und vergessen Sie einfach nicht, dies hinzuzufügen
quelle
Dies funktioniert, ohne dass Sie Ihre Aktivitäten ändern müssen
android:windowSoftInputMode
Schritt 1: Erweitern Sie die EditText-Klasse und überschreiben Sie diese beiden:
Schritt 2: Erstellen Sie diese beiden in Ihrer Aktivität:
***
clearFocus
Denken Sie daran, dass Sie Eltern oder erstes Kind in der Elternhierarchie fokussierbar machen müssen, damit die Arbeit funktioniert.quelle
Dies funktioniert nicht wie gewünscht ...
... haben viele Größenberechnungen verwendet, um zu überprüfen ...
Ich wollte feststellen, ob es offen war oder nicht und fand es
isAcceptingText()
Dies beantwortet die Frage also wirklich nicht, da es sich nicht um das Öffnen oder Schließen handelt, sondern eher um das Öffnen oder Schließen, also um verwandten Code, der anderen in verschiedenen Szenarien helfen kann ...
in einer Aktivität
in einem Fragment
quelle
Überprüfen Sie mit dem folgenden Code:
XML-CODE:
JAVA CODE:
quelle