Mentre tutte le risposte sopra riportate circolano attorno alla stessa idea fondamentale e puoi farlo funzionare con semplici layout usando uno degli esempi sopra. Tuttavia, volevo cambiare il colore dello sfondo mentre utilizzavo la navigazione a frammenti dello schermo intero (a lato della scheda) e mantenevo la navigazione regolare, la scheda e le barre delle azioni.
Dopo aver letto attentamente un articolo di Anton Hadutski ho capito meglio cosa sta succedendo.
Ho DrawerLayout
con ConstraintLayout
(cioè contenitore) che ha Toolbar
, include per il frammento principale eBottomNavigationView
.
Impostazione DrawerLayout
dover fitsSystemWindows
true non è sufficiente, è necessario impostare sia DrawerLayout
e ConstraintLayout
. Supponendo che la barra di stato trasparente, il colore della barra di stato è uguale al colore di sfondo diConstraintLayout
.
Tuttavia, il frammento incluso ha ancora l'inserzione della barra di stato, quindi l'animazione di un altro frammento di "schermo intero" sopra con non cambia il colore della barra di stato.
Un po 'di codice da questo articolo di cui in Activity
's onCreate
:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
0,
insets.systemWindowInsetRight,
insets.systemWindowInsetBottom
)
}
E tutto va bene, tranne ora Toolbar
che non risolve l'altezza della barra di stato. Qualche altro in riferimento all'articolo e abbiamo una soluzione perfettamente funzionante:
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
)
}
Main_activity.xml (tieni presente che marginTop in Toolbar
è a scopo di anteprima, verrà sostituito dal codice):
<?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"
ho aggiunto al mio activity_main.xml. Le barre di sistema sono traslucide e non trasparenti.