Embora todas as respostas acima circulem em torno da mesma idéia fundamental, você pode trabalhar com layouts simples usando um dos exemplos acima. No entanto, eu queria mudar a cor do plano de fundo enquanto usava a navegação em fragmentos deslizante 'tela cheia' (barra de guias à parte) e manter a navegação regular, as guias e as barras de ação.
Depois de ler atentamente um artigo de Anton Hadutski, entendi melhor o que está acontecendo.
Eu tenho DrawerLayout
com ConstraintLayout
(ou seja, contêiner) que tem Toolbar
, incluir para o fragmento principal e BottomNavigationView
.
Definir DrawerLayout
ter fitsSystemWindows
que ser verdadeiro não é suficiente, você precisa definir ambos DrawerLayout
e ConstraintLayout
. Supondo uma barra de status transparente, a cor da barra de status agora é igual à cor de segundo plano ConstraintLayout
.
No entanto, o fragmento incluído ainda possui a barra de status inserida, portanto, animar outro fragmento de 'tela cheia' não altera a cor da barra de status.
Um pouco de código do artigo referido em Activity
's onCreate
:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
0,
insets.systemWindowInsetRight,
insets.systemWindowInsetBottom
)
}
E tudo está bem, exceto agora o Toolbar
não aborda a altura da barra de status. Mais algumas referências ao artigo e temos uma solução 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
)
}
O main_activity.xml (observe que marginTop in Toolbar
é para fins de visualização, ele será substituído pelo 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"
ao meu activity_main.xml. As barras do sistema são translúcidas e não transparentes.