虽然上面所有的答案都围绕着相同的基本思想,但你可以使用上面的一个例子来实现简单的布局。然而,我想改变背景的颜色,同时使用滑动的“全屏”(标签栏除外)片段导航,并保持常规的导航,标签和操作栏。
在仔细阅读Anton Hadutski的一篇文章后,我更好地理解了发生了什么。
我有DrawerLayout与ConstraintLayout(即容器),其中有工具栏,包括主要片段和BottomNavigationView。
设置DrawerLayout有fitsSystemWindows为true是不够的,你需要同时设置DrawerLayout和ConstraintLayout。假设状态栏是透明的,状态栏的颜色现在与ConstraintLayout的背景色相同。
然而,所包含的片段仍然有状态栏的嵌入,所以在上面动画另一个“全屏”片段并不会改变状态栏的颜色。
引用文章中的一小段代码到Activity的onCreate中:
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
0,
insets.systemWindowInsetRight,
insets.systemWindowInsetBottom
)
}
一切都很好,除了现在工具栏不处理状态栏的高度。更多的参考文章,我们有一个完整的工作解决方案:
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是为了预览,它将被代码所取代):
<?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>