Alle oben genannten Antworten basieren auf derselben Grundidee, und Sie können sie anhand eines der obigen Beispiele mit einfachen Layouts zum Laufen bringen. Ich wollte jedoch die Farbe des Hintergrunds ändern, während ich die Fragmentnavigation im Vollbildmodus (neben der Registerkartenleiste) verschob, und die regulären Navigations-, Registerkarten- und Aktionsleisten beibehalten.
Nachdem ich einen Artikel von Anton Hadutski sorgfältig gelesen hatte, hatte ich ein besseres Verständnis dafür, was los ist.
Ich habe DrawerLayout
mit ConstraintLayout
(dh Container) Toolbar
, der für das Hauptfragment und enthält BottomNavigationView
.
Einstellung DrawerLayout
mit fitsSystemWindows
auf true nicht ausreichend ist, müssen Sie beide setzen DrawerLayout
und ConstraintLayout
. Unter der Annahme einer transparenten Statusleiste entspricht die Farbe der Statusleiste jetzt der Hintergrundfarbe von ConstraintLayout
.
Das enthaltene Fragment enthält jedoch weiterhin die Statusleiste, sodass durch das Animieren eines weiteren "Vollbild" -Fragments über mit die Farbe der Statusleiste nicht geändert wird.
Ein bisschen Code aus dem Artikel in Activity
's onCreate
:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
0,
insets.systemWindowInsetRight,
insets.systemWindowInsetBottom
)
}
Und alles ist gut, außer dass jetzt die Toolbar
Höhe der Statusleiste nicht angesprochen wird. Einige weitere beziehen sich auf den Artikel und wir haben eine voll funktionsfähige Lösung:
val toolbar = findViewById<Toolbar>(R.id.my_toolbar)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
val params = toolbar.layoutParams as ViewGroup.MarginLayoutParams
params.topMargin = insets.systemWindowInsetTop
toolbar.layoutParams = params
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
0,
insets.systemWindowInsetRight,
insets.systemWindowInsetBottom
)
}
Die Datei main_activity.xml (bitte beachten Sie, dass marginTop in Toolbar
zu Vorschauzwecken dient und durch den Code ersetzt wird):
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/green"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="@id/container"
android:layout_marginTop="26dp"
android:background="@android:color/transparent"
...>
...
</androidx.appcompat.widget.Toolbar>
<include layout="@layout/content_main" />
...
</androidx.constraintlayout.widget.ConstraintLayout>
...
</androidx.drawerlayout.widget.DrawerLayout>
android:fitsSystemWindows="true"
zu meiner activity_main.xml hinzugefügt . Die Systemleisten sind durchscheinend und nicht transparent.