Ich habe viel recherchiert, um das Layout anzupassen, wenn das Softkeyboard aktiv ist, und ich habe es erfolgreich implementiert, aber das Problem tritt auf, wenn ich android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
dies in meinem Aktivitäts-Tag in der Manifest-Datei verwende.
Dafür habe ich android:windowSoftInputMode="adjustPan|adjustResize|stateHidden"
mit verschiedenen Optionen aber kein Glück verwendet.
Danach habe ich FullScreen
programmgesteuert implementiert und verschiedene Layouts ausprobiert, FullScreen
aber alles umsonst.
Ich habe auf diese Links verwiesen und hier viele Beiträge zu diesem Thema gelesen:
http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html
http://davidwparker.com/2011/08/30/android-how-to-float-a-row-above-keyboard/
Hier ist XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/masterContainerView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ffffff">
<ScrollView android:id="@+id/parentScrollView"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<TextView android:id="@+id/setup_txt" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Setup - Step 1 of 3"
android:textColor="@color/top_header_txt_color" android:textSize="20dp"
android:padding="8dp" android:gravity="center_horizontal" />
<TextView android:id="@+id/txt_header" android:layout_width="fill_parent"
android:layout_height="40dp" android:text="AutoReply:"
android:textColor="@color/top_header_txt_color" android:textSize="14dp"
android:textStyle="bold" android:padding="10dp"
android:layout_below="@+id/setup_txt" />
<EditText android:id="@+id/edit_message"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="Some text here." android:textSize="16dp"
android:textColor="@color/setting_editmsg_color" android:padding="10dp"
android:minLines="5" android:maxLines="6" android:layout_below="@+id/txt_header"
android:gravity="top" android:scrollbars="vertical"
android:maxLength="132" />
<ImageView android:id="@+id/image_bottom"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_below="@+id/edit_message" />
</LinearLayout>
</ScrollView>
<RelativeLayout android:id="@+id/scoringContainerView"
android:layout_width="fill_parent" android:layout_height="50px"
android:orientation="vertical" android:layout_alignParentBottom="true"
android:background="#535254">
<Button android:id="@+id/btn_save" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_alignParentRight="true"
android:layout_marginTop="7dp" android:layout_marginRight="15dp"
android:layout_below="@+id/edit_message"
android:text = "Save" />
<Button android:id="@+id/btn_cancel" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginTop="7dp"
android:layout_marginRight="10dp" android:layout_below="@+id/edit_message"
android:layout_toLeftOf="@+id/btn_save" android:text = "Cancel" />
</RelativeLayout>
</RelativeLayout>
Ich möchte, dass die unteren 2 Tasten nach oben gehen, wenn das Softkeyboard im Bild erscheint.
quelle
android:windowSoftInputMode="adjustPan"
sagen Sie mir, ob dies funktioniert ..adjustResize
undadjustPan
gleichzeitig an, von der javadoc vonandroid.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE
: „Das kann nicht mit {@link SOFT_INPUT_ADJUST_PAN} kombiniert werden“Antworten:
Basierend auf der Problemumgehung von yghm habe ich eine Convenience-Klasse codiert, mit der ich das Problem mit einem Einzeiler lösen kann (natürlich nachdem ich die neue Klasse zu meinem Quellcode hinzugefügt habe). Der Einzeiler ist:
Und die Implementierungsklasse ist:
Hoffe das hilft jemandem.
quelle
return (r.bottom - r.top);
mitreturn r.bottom
ihm auf meinem HTC One Mini bekommen arbeiten, sonst wäre die Aktivitätsansicht zu hoch durch die Größe der Statusleiste geschoben werden. Ich habe es jedoch noch nicht auf einem anderen Gerät getestet. Hoffe das kann helfen.frameLayoutParams.height = usableHeightSansKeyboard;
es zu verwenden, mussframeLayoutParams.height = usableHeightNow;
ich es verwenden. Wenn ich dies nicht tue, fallen einige Elemente außerhalb des Bildschirms.Da die Antwort bereits ausgewählt wurde und das Problem als Fehler bekannt ist, dachte ich, ich würde eine "mögliche Umgehung" hinzufügen.
Sie können den Vollbildmodus umschalten, wenn die Softtastatur angezeigt wird. Dadurch kann das "adjustPan" korrekt funktionieren.
Mit anderen Worten, ich verwende immer noch @android: style / Theme.Black.NoTitleBar.Fullscreen als Teil des Anwendungsthemas und stateVisible | adjustResize als Teil des Soft-Eingabemodus des Aktivitätsfensters, aber um sie zum Zusammenarbeiten zu bringen, muss ich den Vollbildmodus umschalten bevor die Tastatur hochkommt.
Verwenden Sie den folgenden Code:
Schalten Sie den Vollbildmodus aus
Aktivieren Sie den Vollbildmodus
Hinweis - Inspiration kam von: Titel im Vollbildmodus ausblenden
quelle
Ich habe die Lösung von Joseph Johnson ausprobiert , aber wie andere bin ich auf das Problem zwischen Inhalt und Tastatur gestoßen. Das Problem tritt auf, weil der weiche Eingabemodus immer pan , wenn Vollbild - Modus. Dieses Schwenken stört Josephs Lösung, wenn Sie ein Eingabefeld aktivieren, das von der weichen Eingabe ausgeblendet wird.
Wenn die weiche Eingabe angezeigt wird, wird der Inhalt zuerst anhand seiner ursprünglichen Höhe geschwenkt und dann anhand des von der Joseph-Lösung angeforderten Layouts in der Größe geändert. Die Größenänderung und das nachfolgende Layout machen das Schwenken nicht rückgängig, was zu einer Lücke führt. Die vollständige Reihenfolge der Ereignisse lautet:
Es ist nicht möglich, das Schwenken zu deaktivieren, aber es ist möglich, den Schwenkversatz durch Ändern der Höhe des Inhalts auf 0 zu setzen. Dies kann im Listener erfolgen, da es vor dem Schwenken ausgeführt wird. Das Einstellen der Inhaltshöhe auf die verfügbare Höhe führt zu einer reibungslosen Benutzererfahrung, dh ohne Flackern.
Ich habe diese Änderungen auch vorgenommen. Wenn eines dieser Probleme auftritt, lassen Sie es mich wissen:
getWindowVisibleDisplayFrame
. DasRect
wird zwischengespeichert, um ein wenig unnötigen Müll zu vermeiden.Es wurde auf einem Nexus 5 und Emulatoren mit API-Level 16-24 mit Bildschirmgrößen von klein bis groß getestet.
Der Code wurde nach Kotlin portiert, aber das Zurückportieren meiner Änderungen nach Java ist einfach. Lass es mich wissen falls du Hilfe benötigst:
quelle
possiblyResizeChildOfContent
Anruf als auch in denremoveListener
Anruf eingefügt, und selbst nachdem ich denremoveListener
Haltepunkt erreicht habe,possiblyResizeChildOfContent
wird immer noch aufgerufen. Hat noch jemand dieses Problem?Ich habe gerade eine einfache und zuverlässige Lösung gefunden, wenn Sie den System-UI-Ansatz verwenden ( https://developer.android.com/training/system-ui/immersive.html ).
Dies funktioniert in dem Fall, in dem Sie verwenden
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
, z. B. wenn Sie verwendenCoordinatorLayout
.Es funktioniert nicht für
WindowManager.LayoutParams.FLAG_FULLSCREEN
(das, mit dem Sie auch ein Thema festlegen könnenandroid:windowFullscreen
), aber Sie können einen ähnlichen Effekt erzielenSYSTEM_UI_FLAG_LAYOUT_STABLE
(der laut Dokumentation "den gleichen visuellen Effekt hat" ), und diese Lösung sollte wieder funktionieren.Ich habe es auf meinem Gerät mit Marshmallow getestet.
Der Schlüssel ist, dass Soft-Tastaturen auch eines der Systemfenster sind (wie Statusleiste und Navigationsleiste), sodass die
WindowInsets
vom System versendeten Informationen genaue und zuverlässige Informationen darüber enthalten.Für den Anwendungsfall, in
DrawerLayout
dem wir versuchen, hinter die Statusleiste zu zeichnen, können wir ein Layout erstellen, das nur den oberen Einschub ignoriert und den unteren Einschub anwendet, der für die Softtastatur verantwortlich ist.Hier ist mein Brauch
FrameLayout
:Und um es zu benutzen:
Dies sollte theoretisch für jedes Gerät ohne verrückte Modifikation funktionieren, viel besser als jeder Hack, der versucht, eine zufällige
1/3
oder1/4
Bildschirmgröße als Referenz zu verwenden.(Es erfordert API 16+, aber ich verwende Vollbild nur auf Lollipop +, um hinter die Statusleiste zu zeichnen, daher ist dies in diesem Fall die beste Lösung.)
quelle
Bitte beachten Sie, dass
android:windowSoftInputMode="adjustResize"
dies nicht funktioniert, wennWindowManager.LayoutParams.FLAG_FULLSCREEN
es für eine Aktivität eingestellt ist. Sie haben zwei Möglichkeiten.Deaktivieren Sie entweder den Vollbildmodus für Ihre Aktivität. Die Aktivität wird im Vollbildmodus nicht in der Größe geändert. Sie können dies entweder in XML (durch Ändern des Themas der Aktivität) oder in Java-Code tun. Fügen Sie der onCreate () -Methode die folgenden Zeilen hinzu.
ODER
Verwenden Sie eine alternative Methode, um den Vollbildmodus zu erreichen. Fügen Sie Ihrer onCreate () -Methode den folgenden Code hinzu.
Bitte beachten Sie, dass Methode 2 nur in Android 4.1 und höher funktioniert.
quelle
Ich musste mich auch diesem Problem stellen und hatte eine Arbeit, um die ich HTC One, Galaxy S1, S2, S3, Note und HTC Sensation überprüfte.
Fügen Sie einen globalen Layout-Listener in die Stammansicht Ihres Layouts ein
und dort habe ich den Höhenunterschied überprüft und wenn der Höhenunterschied des Bildschirms größer ist als ein Drittel der Bildschirmhöhe, können wir davon ausgehen, dass die Tastatur geöffnet ist. nahm es aus dieser Antwort .
Dies ist wahrscheinlich nicht kugelsicher und auf einigen Geräten funktioniert es möglicherweise nicht, aber es hat bei mir funktioniert und ich hoffe, es wird Ihnen auch helfen.
quelle
Ich habe die Joseph Johnson-Lösung implementiert und sie hat gut funktioniert. Nach der Verwendung dieser Lösung wurde festgestellt, dass die Schublade in der Anwendung manchmal nicht richtig geschlossen wird. Ich habe eine Funktion hinzugefügt, um den Listener removeOnGlobalLayoutListener zu entfernen, wenn der Benutzer das Fragment schließt, in dem sich die Edittexte befinden.
verwendet die Klasse, in der sich meine Edittexte befinden
quelle
In
android:fitsSystemWindows="true"
dem Layout, und das Layout wird die Größe neu.quelle
So funktioniert es mit FullScreen:
Verwenden Sie das ionische Tastatur-Plugin. Auf diese Weise können Sie abhören, wann die Tastatur angezeigt und ausgeblendet wird.
OnDeviceReady fügt diese Ereignis-Listener hinzu:
Die Logik:
Wenn der Unterschied minus ist, ist dies im Grunde die Anzahl der Pixel, die die Tastatur für Ihre Eingabe abdeckt. Wenn Sie also Ihr übergeordnetes Div dadurch anpassen, sollte dies dem entgegenwirken.
Durch Hinzufügen von Zeitüberschreitungen zur Logik, z. B. 300 ms, sollte auch die Leistung optimiert werden (da dadurch die Tastaturzeit angezeigt wird.
quelle
Ich habe Joseph Johnsons Unterricht ausprobiert und es hat funktioniert, aber meine Bedürfnisse wurden nicht ganz erfüllt. Anstatt android: windowSoftInputMode = "adjustResize" zu emulieren, musste ich android: windowSoftInputMode = "adjustPan" emulieren.
Ich verwende dies für eine Vollbild-Webansicht. Um die Inhaltsansicht auf die richtige Position zu verschieben, muss eine Javascript-Oberfläche verwendet werden, die Details zur Position des Seitenelements enthält, das den Fokus hat und somit die Tastatureingabe empfängt. Ich habe diese Details weggelassen, aber meine Umschreibung von Joseph Johnsons Klasse bereitgestellt. Es bietet Ihnen eine sehr solide Basis, um eine benutzerdefinierte Pfanne im Vergleich zu seiner Größenänderung zu implementieren.
quelle
In der Tat scheint das Erscheinungsbild der Softtastatur das
Activity
in keiner Weise zu beeinflussen , egal waswindowSoftInputMode
ich imFullScreen
Modus auswähle .Obwohl ich zu dieser Eigenschaft nicht viel Dokumentation finden konnte, denke ich, dass der
FullScreen
Modus für Spieleanwendungen entwickelt wurde, bei denen die Softtastatur nicht viel verwendet werden muss. Wenn es sich bei Ihrer Aktivität um eine Aktivität handelt, für die eine Benutzerinteraktion über eine Softtastatur erforderlich ist, überdenken Sie bitte die Verwendung eines Nicht-Vollbild-Themas. Sie können die Titelleiste mithilfe einesNoTitleBar
Themas deaktivieren . Warum sollten Sie die Benachrichtigungsleiste ausblenden?quelle
Einfach so bleiben
android:windowSoftInputMode="adjustResize"
. Da nur eines von"adjustResize"
und"adjustPan"
ferngehalten werden soll (Der Fensteranpassungsmodus wird entweder mit adjustResize oder adjustPan angegeben. Es wird dringend empfohlen, immer das eine oder das andere anzugeben). Sie finden es hier: http://developer.android.com/resources/articles/on-screen-inputs.htmlEs funktioniert perfekt für mich.
quelle
Verwenden
android:windowSoftInputMode="adjustResize|stateHidden
Sie AdjustPan nur, wenn Sie es verwenden, und deaktivieren Sie dann die Größenänderungseigenschaftquelle
quelle
Ich verwende derzeit diesen Ansatz und er funktioniert wie ein Zauber. Der Trick besteht darin, dass wir die Tastaturhöhe mit verschiedenen Methoden auf 21 oben und unten ermitteln und sie dann als untere Auffüllung unserer Stammansicht in unserer Aktivität verwenden. Ich habe angenommen, dass Ihr Layout keine obere Polsterung benötigt (geht unter die Statusleiste), aber falls Sie dies tun, informieren Sie mich, um meine Antwort zu aktualisieren.
MainActivity.java
Vergessen Sie nicht, Ihre Stammansicht mit einer ID zu versehen:
activity_main.xml
Hoffe es hilft jemandem.
quelle
basierend auf https://stackoverflow.com/a/19494006/1815624 und dem Wunsch, dies zu verwirklichen ...
aktualisierte Idee
Antworten aus kombinieren
Relevanter Code:
Vollständige Quelle unter https://github.com/CrandellWS/AndroidBug5497Workaround/blob/master/AndroidBug5497Workaround.java
alte Idee
Erstellen Sie vor dem Öffnen der Tastatur einen statischen Wert für die Containerhöhe. Stellen Sie die Containerhöhe basierend auf dem
usableHeightSansKeyboard - heightDifference
Zeitpunkt des Öffnens der Tastatur ein und setzen Sie sie beim Schließen auf den gespeicherten Wert zurückMethoden in MainActivity
Beispiel Container XML
Ebenso können bei Bedarf Ränder hinzugefügt werden ...
Eine weitere Überlegung ist die Verwendung von Polstern. Ein Beispiel hierfür finden Sie unter:
https://github.com/mikepenz/MaterialDrawer/issues/95#issuecomment-80519589
quelle
1) Erstellen Sie KeyboardHeightHelper:
2) Lassen Sie Ihre Aktivität im Vollbildmodus sein:
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
3) Achten Sie auf Änderungen der Tastaturhöhe und fügen Sie Ihrer Ansicht eine untere Polsterung hinzu:
So wird jedes Mal , Tastatur , um den Bildschirm auf - Bodenpolster für Ihre Ansicht wird sich ändern, und Inhalte werden neu angeordnet werden.
quelle
Sie möchten, dass die untere Leiste am unteren Rand der Ansicht bleibt, aber wenn die Tastatur angezeigt wird, sollten sie nach oben verschoben werden, um über der Tastatur platziert zu werden, oder?
Sie können dieses Code-Snippet ausprobieren:
Die untere Leiste bleibt am unteren Rand der Ansicht hängen, und das LinearLayout mit der ScrollView nimmt die verbleibenden Teile der Ansicht auf, nachdem die obere / untere Leiste und die Tastatur angezeigt wurden. Lassen Sie mich wissen, ob es auch bei Ihnen funktioniert.
quelle
Danke Joseph für deine Antwort. In der Methode evtl.ResizeChildOfContent () ist jedoch der Teil
funktionierte nicht für mich, da der untere Teil der Sicht verborgen wurde. Also musste ich eine globale Variable restoreHeight nehmen und im Konstruktor die letzte Zeile einfügen
und dann habe ich den erstgenannten Teil durch ersetzt
Aber ich habe keine Ahnung, warum Ihr Code bei mir nicht funktioniert hat. Es wäre eine große Hilfe, wenn jemand Licht ins Dunkel bringen könnte.
quelle
Ich habe nur den Vollbildmodus verwendet, um die Statusleiste auszublenden. Ich möchte jedoch, dass die Größe der App geändert wird, wenn die Tastatur angezeigt wird. Alle anderen Lösungen (wahrscheinlich aufgrund des Alters der Veröffentlichung) waren für meine Verwendung kompliziert oder nicht möglich (ich möchte vermeiden, den Java-Code für den Sack von PhoneGap Build zu ändern).
Anstatt Vollbild zu verwenden, habe ich meine Konfiguration für Android so geändert, dass sie nicht im Vollbildmodus angezeigt wird:
Und fügte hinzu
cordova-plugin-statusbar
, über die Kommandozeile:Wenn die App geladen wurde, rufe ich einfach eine Methode im Plugin auf, um sich zu verstecken, wie:
Das funktioniert wie ein Zauber. Der einzige wirkliche Nachteil ist, dass die Statusleiste beim Laden der App kurz sichtbar ist. Für meine Bedürfnisse war das kein Problem.
quelle
Ich habe alle möglichen Antworten von stackOverflow ausprobiert und nach einer Woche lange Suche endlich gelöst. Ich habe das Koordinatenlayout verwendet und dies mit linearLayout geändert und mein Problem ist behoben. Ich weiß nicht, ob das Koordinatenlayout Fehler oder irgendetwas von meinem Fehler enthält.
quelle
Ich habe viele Lösungen ausprobiert, darunter die von Joseph Johnson und Johan Stuyts. Infolgedessen habe ich auf einigen Geräten (wie dem Lenovo s820) in allen Fällen einen Leerraum zwischen Inhalt und Tastatur erhalten. Also habe ich einige Änderungen an ihren Codes vorgenommen und endlich eine funktionierende Lösung gefunden.
Meine Idee basiert auf dem Hinzufügen eines Randes zum oberen Rand des Inhalts, wenn die Tastatur angezeigt wird.
Wie Sie sehen können, addiere ich 30 Pixel zum Unterschied, da zwischen dem oberen Bildschirmrand und der Inhaltszone mit Rand ein kleiner weißer Bereich vorhanden ist. Und ich weiß nicht, woher es kommt, also habe ich beschlossen, die Ränder kleiner zu machen, und jetzt funktioniert es genau so, wie ich es brauchte.
quelle
Heute funktioniert nicht anpassen adjustResize auf Vollbild Problem ist aktuell für Android SDK.
Aus den Antworten fand ich:
die Lösung - aber die Lösung zeigt dies auf dem Bild:
Dann habe ich die Lösung gefunden und die eine unnötige Aktion entfernt:
Siehe also meinen festen Lösungscode auf Kotlin:
Mein Code zur Fehlerbehebung:
quelle
Verwenden Sie nicht:
weil funktioniert schlecht. Verwenden Sie stattdessen:
quelle
In meinem Fall trat dieses Problem auf, als ich meiner Cordova-Anwendung Crosswalk hinzufügte. Meine App wird nicht in Vollbild und Android verwendet: windowSoftInputMode = "adjustPan".
Ich hatte bereits das Plugin für ionische Tastaturen in der Anwendung, sodass es dank dieser Funktion leicht zu erkennen war, ob die Tastatur hoch oder runter war:
Ich habe alle oben genannten Korrekturen ausprobiert, aber die einfache Zeile, die es für mich getan hat, war dieses bisschen CSS:
Ich hoffe, das erspart Ihnen die wenigen Tage, die ich damit verbracht habe. :) :)
quelle