Ich habe Probleme mit der durchscheinenden Actionbar / Navbar im neuen Android KitKat (4.4) und dem windowSoftInputMode="adjustResize"
.
Wenn Sie den InputMode normalerweise auf adjustResize ändern, sollte sich die Größe der App ändern, wenn die Tastatur angezeigt wird ... aber hier nicht! Wenn ich die Linien für den transparenten Effekt lösche, funktioniert die Größenänderung.
Wenn also die Tastatur sichtbar ist, befindet sich meine ListView darunter und ich kann nicht auf die letzten Elemente zugreifen. (Nur durch manuelles Ausblenden der Tastatur)
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.XYZStyle" >
<activity
android:name="XYZ"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
values-v19 / styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView_contacts"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:divider="@null"
android:dividerHeight="0dp"
android:drawSelectorOnTop="true"
android:fastScrollAlwaysVisible="true"
android:fastScrollEnabled="true"
android:paddingBottom="@dimen/navigationbar__height" >
</ListView>
</RelativeLayout>
Irgendwelche Ideen, um das zu beheben?
Antworten:
Ihnen fehlt die folgende Eigenschaft:
im Stammverzeichnis
RelativeLayout
des XML-Layouts des Fragments .Aktualisieren:
Letztes Jahr gab es einen interessanten Vortrag von Chris Bane, der ausführlich erklärt, wie das funktioniert:
https://www.youtube.com/watch?v=_mGDMVRO3iE
quelle
Es gibt eine ähnliche Fehlerbericht hier . Ich habe eine Problemumgehung gefunden, die nach begrenzten Tests den Trick ohne Auswirkungen zu tun scheint. Fügen Sie mit der folgenden Logik eine benutzerdefinierte Implementierung Ihres Stamms hinzu
ViewGroup
(die ich fast immer verwendeFrameLayout
, also habe ich dies getestet). Verwenden Sie dann dieses benutzerdefinierte Layout anstelle Ihres Root-Layouts und stellen Sie sicher, dass Sie es festlegenandroid:fitsSystemWindows="true"
. Sie können danngetInsets()
jederzeit nach dem Layout aufrufen (z. B. ein hinzufügenOnPreDrawListener
), um den Rest Ihres Layouts anzupassen und gegebenenfalls die Systemeinfügungen zu berücksichtigen.Da
fitSystemWindow
s veraltet ist, lesen Sie bitte die Antwort unten, um die Problemumgehung abzuschließen.quelle
Die Antwort von @kcoppock ist wirklich hilfreich, aber fitSystemWindows wurde in API-Level 20 nicht mehr unterstützt
Seit API 20 (KITKAT_WATCH) sollten Sie also onApplyWindowInsets überschreiben
quelle
ViewCompat.setOnApplyWindowInsetsListener
dispatchApplyWindowInsets
stattdessen hat das Überschreiben (der gleiche Code) für mich funktioniertDies funktionierte für mich, um eine durchscheinende Statusleiste zu haben und die Größe in Fragment anzupassen:
Erstellen Sie ein benutzerdefiniertes RelativeLayout, wie @ Victor91 und @kcoppock sagten.
Verwenden Sie CustomRelativeLayout als übergeordnetes Layout für Ihr Fragment.
Deklariere Thema mit Android: windowTranslucentStatus = true
Die Containeraktivität muss im Manifest mit android: windowSoftInputMode = "adjustResize" deklariert werden und das deklarierte Thema verwenden
Bitte verwenden Sie fitSystemWindows für das Fragment-Root-Layout!
Dann in XML,
quelle
Wenn Sie die Einfügungen anpassen möchten und auf API-Ebene> = 21 abzielen, können Sie dies erreichen, ohne eine benutzerdefinierte Ansichtsgruppe erstellen zu müssen. Durch
fitsSystemWindows
einfaches Einstellen wird das Auffüllen standardmäßig auf Ihre Containeransicht angewendet, was Sie möglicherweise nicht möchten.Die Versionsprüfungen sind in diese Methode integriert und nur Geräte> = 21 führen den Code im Lambda aus. Kotlin Beispiel:
Stellen Sie sicher, dass Ihr Layout weiterhin das
fitsSystemWindows
Flag setzt, da sonst der Listener für Fenstereinfügungen nicht aufgerufen wird.Diese Quellen sind hilfreich:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec https://medium.com/@azizbekian/windowinsets-24e241d4afb9
quelle
BaseFragment
zusammen mit anwenden könnenview.fitsSystemWindows = true
und es nur ohne Änderungen an den tatsächlichen XML-Layouts oder View-Unterklassen funktioniert.Ich hatte das gleiche Problem: Meine Aktivität hatte eine ScrollView als Stammansicht und bei aktivierter durchscheinender Statusleiste wurde die Größe nicht korrekt geändert, wenn die Tastatur angezeigt wurde ... und der Bildschirm wurde nicht gescrollt, um die Eingabeansichten auszublenden.
Lösung: Alles (Layout und Aktivitätslogik) wurde in ein neues Fragment verschoben. Dann wurde die Aktivität so geändert, dass nur dieses Fragment enthalten ist. Jetzt funktioniert alles wie erwartet!
Dies ist das Layout der Aktivität:
quelle
Basierend auf Joseph Johnsons Problemumgehung in Android So passen Sie das Layout im Vollbildmodus an, wenn das Softkeyboard sichtbar ist
Rufen Sie dies
onCreate()
nachhersetContentView()
in Ihrer Aktivität an.AndroidBug5497Workaround.assistActivity(this);
ein litte kann von Original abweichen ersetzen
return (r.bottom - r.top);
mitreturn r.bottom;
incomputeUsableHeight()
Aus irgendeinem Grund muss ich mein Aktivitätsattribut
fitsSystemWindows
auf setzenfalse
.Diese Problemumgehung hat mich gerettet. es funktioniert gut für mich. Hoffnung kann dir helfen.
Die Implementierungsklasse ist:
quelle
Es sollte nicht mit der durchscheinenden Statusleiste funktionieren. Diese Einstellung zwingt das Fenster in den Vollbildmodus, der mit adjustResize nicht funktioniert.
Sie können entweder adjustPan oder die Eigenschaften fitsSystemWindows verwenden. Ich würde jedoch empfehlen, über das Feature zu lesen, es hat erhebliche Nebenwirkungen:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
quelle
AndroidBug5497Workaround.java sorgen für Speicherverlust. brauche unten Code
Mein Beispiel mit RxJava, das bei onPause () im Lebenszyklus von Activity automatisch removeOnGlobalLayoutListener () aufruft
quelle
Ich hatte gerne ein Problem.
Ich habe windowDrawsSystemBarBackgrounds auf 'true' gesetzt und meine App sollte in der Statusleiste angezeigt werden.
Es ist mein Aktivitätsthema.
und ich bekam Hilfe von Jianshus Blog . Sie können Code lesen, aber Text wie ich. Ich füge ein paar weitere Codes hinzu.
Dies ist mein Fragment-Layout.
Ich möchte, dass es Ihnen hilfreich ist. Viel Glück!
quelle
quelle
Ich hatte das gleiche Problem. Ich habe mit Koordinatorlayout gelöst
activity.main.xml
content_main2.xml
MainActivity.java
Fügen Sie nun diese Zeile hinzu. linearLayoutManager.setStackFromEnd (true);
quelle
quelle
Fügen Sie dies zuerst in Ihrem Root-Layout hinzu.
Wenn Sie diesen Ansatz verwenden, müssen Sie sicherstellen, dass wichtige Teile der Benutzeroberfläche Ihrer App (z. B. die in einer Maps-Anwendung integrierten Steuerelemente) nicht von Systemleisten abgedeckt werden. Dies könnte Ihre App unbrauchbar machen. In den meisten Fällen können Sie dies tun, indem Sie das Attribut android: fitSystemWindows zu Ihrer XML-Layoutdatei hinzufügen, das auf true festgelegt ist. Dadurch wird der Abstand der übergeordneten ViewGroup angepasst, um Platz für die Systemfenster zu lassen. Dies ist für die meisten Anwendungen ausreichend.
In einigen Fällen müssen Sie jedoch möglicherweise die Standardauffüllung ändern, um das gewünschte Layout für Ihre App zu erhalten. Überschreiben Sie fitSystemWindows (Rect-Einfügungen), um direkt zu steuern, wie Ihr Inhalt relativ zu den Systemleisten angeordnet ist (die einen Bereich einnehmen, der als "Inhaltseinfügungen" des Fensters bezeichnet wird). Die Methode fitSystemWindows () wird von der Ansichtshierarchie aufgerufen, wenn sich die Inhaltseinfügungen für ein Fenster geändert haben, damit das Fenster seinen Inhalt entsprechend anpassen kann. Durch Überschreiben dieser Methode können Sie die Einfügungen (und damit das Layout Ihrer App) beliebig behandeln.
https://developer.android.com/training/system-ui/status#behind
Wenn Sie ein Master-Fensterbauer werden möchten, schauen Sie sich bitte das Video des Android-Entwicklers an. https://www.youtube.com/watch?v=_mGDMVRO3iE
quelle
Die bewährte Methode ermöglicht dem Benutzer das Scrollen von Inhalten, wenn die Tastatur angezeigt wird. Um diese Funktionalität hinzuzufügen, müssen Sie Ihr Root-Layout in die Aktivitätsmethode einfügen
ScrollView
und diese verwendenwindowSoftInputMode="adjustResize"
.Wenn Sie diese Funktion jedoch mit
<item name="android:windowTranslucentStatus">true</item>
Flag für Android 5-Inhalte verwenden möchten, können Sie nicht scrollen und überschneiden sich mit der Tastatur.Überprüfen Sie diese Antwort, um dieses Problem zu beheben
quelle