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 DrawerLayout
avec ConstraintLayout
(ie conteneur) qui a Toolbar
, inclure pour le fragment principal et BottomNavigationView
.
Réglage DrawerLayout
ayant fitsSystemWindows
true ne suffit pas, vous devez définir à la fois DrawerLayout
et 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 Toolbar
ne 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 Toolbar
est à 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.