Si bien todas las respuestas anteriores circulan en torno a la misma idea fundamental y puede hacer que funcione con diseños simples utilizando uno de los ejemplos anteriores. Sin embargo, quería cambiar el color del fondo mientras usaba la navegación de fragmentos deslizante 'pantalla completa' (barra de pestañas a un lado) y mantener la navegación regular, pestañas y barras de acción.
Después de leer cuidadosamente un artículo de Anton Hadutski , comprendí mejor lo que está sucediendo.
Tengo DrawerLayout
con ConstraintLayout
(es decir, contenedor) que tiene Toolbar
, incluir para el fragmento principal y BottomNavigationView
.
Establecer DrawerLayout
tener fitsSystemWindows
que ser verdadero no es suficiente, necesita establecer ambos DrawerLayout
y ConstraintLayout
. Suponiendo una barra de estado transparente, el color de la barra de estado ahora es el mismo que el color de fondo de ConstraintLayout
.
Sin embargo, el fragmento incluido todavía tiene el recuadro de la barra de estado, por lo que animar otro fragmento de 'pantalla completa' encima no cambia el color de la barra de estado.
Un poco de código del artículo que se refiere a Activity
's onCreate
:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
0,
insets.systemWindowInsetRight,
insets.systemWindowInsetBottom
)
}
Y todo está bien, excepto que ahora Toolbar
no aborda la altura de la barra de estado. Un poco más refiriéndose al artículo y tenemos una solución totalmente funcional:
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 (tenga en cuenta que marginTop in Toolbar
es para fines de vista previa, será reemplazado por el código):
<?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"
a mi activity_main.xml. Las barras del sistema son translúcidas y no transparentes.