如何将系统导航栏的背景颜色设置为Material 3中新增的底部导航栏的背景颜色? (安卓)

问题描述 投票:0回答:3

我尝试使用这个:

<item name="android:navigationBarColor">?attr/colorSurface</item>

但它没有给我想要的结果..就像文档中显示的那样: enter image description here enter image description here

我最近切换到材质 3。

如果您想要应用程序的完整代码:https://github.com/Sujal1245/WALLisWALL-Wallpaper-App

java android colors material-design themes
3个回答
12
投票

Material Components 库中的 1.5.0 版本(特别是 1.5.0-alpha03)及更高版本中有一个新类可以解决这个问题,即 SurfaceColors 类。

要使用它,请对

getColor
枚举中的常量值之一调用
SurfaceColors
方法以获得所需的颜色。这是一个例子:

getWindow().setNavigationBarColor(SurfaceColors.SURFACE_2.getColor(this));

SURFACE_2
BottomNavigationView
使用的内容(或其等效内容)。无论有没有动态着色(包括夜间模式),它都可以工作。我还观察到这个解决方案在 Google 文件应用程序中使用。

这是Android 11的屏幕截图

这是 Android 12.1 上动态着色的屏幕截图

如果您还对 Google 用于

BottomNavigationView
的确切阴影感到好奇,它是一个 5dp 高的渐变,可绘制从 #00000000 到 #33333333。


6
投票

除了尼克的回答。如果您使用动态着色。设置动态着色后调用该方法。否则,你将始终得到相同的颜色,而没有动态效果。

Kotlin 代码

DynamicColors.applyIfAvailable(this) // After this
window.navigationBarColor = SurfaceColors.SURFACE_2.getColor(this)

谢谢。


0
投票

我发现,使用 API35 和 EdgeToEdge,现有答案会导致导航栏的颜色与

BottomNavigationView
略有不同。相反,在我的情况下,在 Activity 中启用 EdgeToEdge 就足够了,如下所示:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    EdgeToEdge.enable(
            this,
            SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT),
            SystemBarStyle.light(Color.TRANSPARENT, Color.TRANSPARENT));
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // ...
}

这将使导航栏透明,并且它将采用

BottomNavigationView
的颜色。

© www.soinside.com 2019 - 2024. All rights reserved.