Ich möchte das Layout basierend darauf ändern, ob die virtuelle Tastatur angezeigt wird oder nicht. Ich habe die API und verschiedene Blogs durchsucht, kann aber anscheinend nichts Nützliches finden.
Ist es möglich?
Vielen Dank!
android
events
android-softkeyboard
Schleifer Versluys
quelle
quelle
Antworten:
Hinweis
Sie müssen Konfigurationsänderungen selbst vornehmen.
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
Stichprobe:
Ändern Sie dann einfach die Sichtbarkeit einiger Ansichten, aktualisieren Sie ein Feld und ändern Sie Ihre Layoutdatei.
quelle
newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO
~ ChrisDies ist möglicherweise nicht die effektivste Lösung. Aber das hat bei mir jedes Mal funktioniert ... Ich rufe diese Funktion überall dort auf, wo ich das softKeyboard hören muss.
Hinweis: Dieser Ansatz verursacht Probleme, wenn der Benutzer eine schwebende Tastatur verwendet.
quelle
android:windowSoftInputMode="adjustPan"
oderadjustResize
mit einem Vollbildfenster festgelegt wurden, da die Größe des Layouts niemals geändert wird.Wenn Sie das Ein- / Ausblenden des (virtuellen) IMM-Tastaturfensters in Ihrer Aktivität behandeln möchten, müssen Sie Ihr Layout in Unterklassen unterteilen und die onMesure-Methode überschreiben (damit Sie die gemessene Breite und die gemessene Höhe Ihres Layouts bestimmen können). Danach legen Sie mit setContentView () das untergeordnete Layout als Hauptansicht für Ihre Aktivität fest. Jetzt können Sie IMM-Fensterereignisse ein- und ausblenden. Wenn das kompliziert klingt, ist es nicht wirklich so. Hier ist der Code:
main.xml
Deklarieren Sie jetzt in Ihrer Aktivität die Unterklasse für Ihr Layout (main.xml).
Sie können dem Code entnehmen, dass wir das Layout für unsere Aktivität im Unterklassenkonstruktor aufblasen
Und jetzt legen Sie einfach die Inhaltsansicht des untergeordneten Layouts für unsere Aktivität fest.
quelle
android:windowSoftInputMode="adjustPan"
oderadjustResize
mit einem Vollbildfenster festgelegt wurden, da die Größe des Layouts niemals geändert wird.Ich habe es so gemacht:
OnKeyboardVisibilityListener
Schnittstelle hinzufügen .HomeActivity.java :
Hoffe das würde dir helfen.
quelle
Basierend auf dem Code von Nebojsa Tomcic habe ich die folgende RelativeLayout-Unterklasse entwickelt:
Dies funktioniert ganz gut ... Markieren Sie, dass diese Lösung nur funktioniert, wenn der Soft Input-Modus Ihrer Aktivität auf "WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE" eingestellt ist.
quelle
android:windowSoftInputMode="adjustPan"
oderadjustResize
mit einem Vollbildfenster festgelegt wurden, da die Größe des Layouts niemals geändert wird.Registrieren Sie wie bei @ amalBits Antwort einen Listener für das globale Layout und berechnen Sie die Differenz zwischen dem sichtbaren Boden von dectorView und dem vorgeschlagenen Boden. Wenn der Unterschied größer als ein Wert ist (geschätzte IME-Höhe), denken wir, dass IME oben ist:
Die Höhenschwelle 100 ist die geschätzte Mindesthöhe von IME.
Dies funktioniert sowohl für adjustPan als auch für adjustResize.
quelle
Nebojsas Lösung hat bei mir fast funktioniert. Als ich in einen mehrzeiligen EditText klickte, wusste ich, dass die Tastatur angezeigt wurde, aber als ich anfing, in den EditText zu tippen, waren die tatsächliche Höhe und die vorgeschlagene Höhe immer noch gleich, sodass nicht bekannt war, dass die Tastatur noch angezeigt wurde. Ich habe eine geringfügige Änderung vorgenommen, um die maximale Höhe zu speichern, und es funktioniert einwandfrei. Hier ist die überarbeitete Unterklasse:
quelle
Ich bin mir nicht sicher, ob jemand dies postet. Fand diese Lösung einfach zu bedienen! . Die SoftKeyboard-Klasse befindet sich auf gist.github.com . Aber während der Tastatur-Popup / Hide-Ereignis-Rückruf benötigen wir einen Handler, um die Dinge auf der Benutzeroberfläche richtig zu machen:
quelle
Ich löse dieses Problem, indem ich onKeyPreIme (int keyCode, KeyEvent-Ereignis) in meinem benutzerdefinierten EditText überschreibe.
quelle
Ich habe eine Art Hack, um das zu tun. Es gibt zwar keine Möglichkeit zu erkennen , zu sein scheint , wenn die Soft - Tastatur angezeigt oder verborgen hat, Sie können in der Tat erkennen , wenn es etwa indem eine ein- oder ausgeblendet werden ,
OnFocusChangeListener
auf dasEditText
gerade hören , dass Sie an.HINWEIS: Eine Sache, die Sie bei diesem Hack beachten sollten, ist, dass dieser Rückruf sofort ausgelöst wird, wenn der
EditText
Fokus gewinnt oder verliert. Dies wird tatsächlich ausgelöst, bevor die Softtastatur angezeigt oder ausgeblendet wird. Der beste Weg, etwas zu tun, nachdem die TastaturHandler
angezeigt oder ausgeblendet wurde, besteht darin, a zu verwenden und etwas ~ 400 ms zu verzögern, wie folgt:quelle
OnFocusChangeListener
Gibt nur an, obEditText
der Fokus nach einer Statusänderung geändert wurde. Aber dasIME
kann versteckt sein, wennEditText
Fokus hat, wie man diesen Fall erkennt?Sander, ich glaube, Sie versuchen, die von der Softtastatur blockierte Ansicht anzuzeigen. Versuchen Sie dies http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html .
quelle
Ich habe das Problem bei der einzeiligen Textansicht-Rückcodierung gelöst.
quelle
Sie können auch nach der untergeordneten Polsterung von DecorView suchen. Es wird auf einen Wert ungleich Null gesetzt, wenn die Tastatur angezeigt wird.
quelle
Hide | Show-Ereignisse für die Tastatur können durch einfachen Hack in OnGlobalLayoutListener abgehört werden:
Hier ist activityRootView die Stammansicht Ihrer Aktivität.
quelle
Verwenden von viewTreeObserver zum einfachen Abrufen des Tastaturereignisses.
** layout_parent ist deine Ansicht wie
edit_text.parent
quelle
Die Antwort von Nebojsa Tomcic war für mich nicht hilfreich. Ich habe
RelativeLayout
mitTextView
undAutoCompleteTextView
drin. Ich muss nachTextView
unten scrollen , wenn die Tastatur angezeigt wird und wenn sie ausgeblendet ist. Um dies zu erreichen, habe ich dieonLayout
Methode überschrieben und es funktioniert gut für mich.quelle