Alors que toutes les réponses ci-dessus circulent autour de la même idée fondamentale et que vous pouvez la faire fonctionner avec des mises en page simples en utilisant l'un des exemples ci-dessus. Cependant, je voulais changer la couleur de l'arrière-plan tout en utilisant la navigation par fragment glissant `` plein écran '' (barre d'onglets à part) et maintenir une navigation régulière, des barres d'onglets et d'actions.
Après avoir lu attentivement un article d'Anton Hadutski, j'ai mieux compris ce qui se passe.
J'ai DrawerLayoutavec ConstraintLayout(ie conteneur) qui a Toolbar, inclure pour le fragment principal et BottomNavigationView.
Réglage DrawerLayoutayant fitsSystemWindowstrue ne suffit pas, vous devez définir à la fois DrawerLayoutet ConstraintLayout. En supposant que la barre d'état soit transparente, la couleur de la barre d'état est maintenant la même que la couleur d'arrière-plan de ConstraintLayout.
Cependant, le fragment inclus a toujours l'encart de la barre d'état, donc animer un autre fragment `` plein écran '' au-dessus de ne change pas la couleur de la barre d'état.
Un peu de code de l'article référencé dans Activity's onCreate:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
0,
insets.systemWindowInsetRight,
insets.systemWindowInsetBottom
)
}
Et tout va bien, sauf que maintenant, le Toolbarne traite pas de la hauteur de la barre d'état. Un peu plus faisant référence à l'article et nous avons une solution entièrement fonctionnelle:
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
)
}
Le main_activity.xml (veuillez noter que marginTop in Toolbarest à des fins de prévisualisation, il sera remplacé par le code):
<?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"à mon activity_main.xml. Les barres du système sont translucides et non transparentes.