Хоча всі відповіді вище циркулюють навколо однієї основної ідеї, і ви можете змусити її працювати з простими макетами, використовуючи один із прикладів вище. Однак я хотів змінити колір тла, використовуючи розсувний 'повноекранний' (панель вкладки в сторону) навігацію по фрагментах і підтримувати регулярну смугу навігації, вкладки та дії.
Прочитавши уважно статтю Антона Хадуцького, я краще зрозумів, що відбувається.
Я маю DrawerLayout
з ConstraintLayout
(тобто контейнер), який має Toolbar
, включають для основного фрагмента іBottomNavigationView
.
Установка DrawerLayout
маючи fitsSystemWindows
істина не є достатнім, вам необхідно встановити як DrawerLayout
і ConstraintLayout
. Якщо припустити прозору панель стану, колір рядка стану тепер такий же, як і колір тлаConstraintLayout
.
Однак включений фрагмент все ще має вставку рядка стану, тому анімація ще одного фрагмента "на весь екран" зверху з не змінює колір рядка стану.
Трохи коду із згаданої статті в Activity
s onCreate
:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
0,
insets.systemWindowInsetRight,
insets.systemWindowInsetBottom
)
}
І все добре, за винятком випадків, коли Toolbar
це не стосується висоти рядка стану. Ще кілька посилань на статтю, і ми маємо повністю працююче рішення:
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 (зауважте, що marginTop Toolbar
призначений для попереднього перегляду, він буде замінений кодом):
<?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"
до своєї діяльності_main.xml. Панелі системи є напівпрозорими та непрозорими.