Podczas gdy wszystkie powyższe odpowiedzi krążą wokół tego samego podstawowego pomysłu i możesz go zmusić do pracy z prostymi układami, korzystając z jednego z powyższych przykładów. Chciałem jednak zmienić kolor tła podczas korzystania z przesuwanej nawigacji po fragmentach „pełnego ekranu” (poza paskiem zakładek) i zachować regularną nawigację, paski kart i akcji.
Po uważnym przeczytaniu artykułu Antona Hadutskiego lepiej zrozumiałem, co się dzieje.
Mam DrawerLayout
z ConstraintLayout
(czyli kontener) który ma Toolbar
, dołączam do głównego fragmentu i BottomNavigationView
.
Ustawianie DrawerLayout
mając fitsSystemWindows
na true nie wystarcza, trzeba ustawić zarówno DrawerLayout
i ConstraintLayout
. Zakładając przezroczysty pasek stanu, kolor paska stanu jest teraz taki sam jak kolor tła programuConstraintLayout
.
Jednak dołączony fragment nadal ma wstawkę paska stanu, więc animacja kolejnego fragmentu „pełnego ekranu” na górze nie zmienia koloru paska stanu.
Trochę kodu z określoną w artykule Activity
„s onCreate
:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
0,
insets.systemWindowInsetRight,
insets.systemWindowInsetBottom
)
}
I wszystko jest w porządku, z wyjątkiem tego, że teraz Toolbar
nie dotyczy wysokości paska stanu. Trochę więcej odwołując się do artykułu i mamy w pełni działające rozwiązanie:
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
)
}
Plik main_activity.xml (pamiętaj, że marginTop Toolbar
służy do podglądu, zostanie zastąpiony kodem):
<?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"
do mojego pliku activity_main.xml. Słupki systemowe są półprzezroczyste i nieprzezroczyste.