我为我的应用程序使用两种不同的背景,具体取决于哪个屏幕处于活动状态。一般来说,状态栏是透明的,背景应该放在它后面。根据背景,我需要状态栏文本的颜色为浅色或深色。
到目前为止,我使用此主题属性使状态栏透明(它确实是半透明的,但如果有人知道如何让它透明,将不胜感激)
<item name="android:windowTranslucentStatus">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
每当背景应该像这样切换时,我正在使用 Jetpack 导航来导航并将参数传递给目的地
mNavController.addOnDestinationChangedListener((controller, destination, arguments) -> {
if (arguments != null) {
setUseSecondaryBackground(arguments.getBoolean("bg_line_style", false));
}
});
这真的很好。现在不起作用的部分是状态栏文本颜色的切换:
private void setUseSecondaryBackground(boolean useLineBackground) {
if (useLineBackground) {
//Stuff to switch backgrounds
windowController.setAppearanceLightStatusBars(false); //Works fine
} else {
//Stuff to switch backgrounds
//Does not work!!! If enabled the whole background is shifted downward by the status bar hight - see pictures
windowController.setAppearanceLightStatusBars(true);
}
}
这是使用的控制器,创建于onCreate()
我的MainActivity
windowController = new WindowInsetsControllerCompat(this.getWindow(), this.getWindow().getDecorView());
在这里您可以看到状态栏是绿色的,因为 mainActivity 的背景位于半透明状态栏的后面。windowController.setAppearanceLightStatusBars(true);
评论了这个版本
在这里,您看到状态栏是白色的,文本是白色的(因为它仍然是绿色背景),但它被向下移动并被某种默认的白色状态栏背景取代。查看电池图标现在的位置。windowController.setAppearanceLightStatusBars(true);
未发表评论并在沿路某处被处决
更新:
在此之后,我能够在运行 Android 10 的测试设备上获得所需的结果。
在 Emulator Running API 30 上,我现在还有一个问题:
WindowCompat.setDecorFitsSystemWindows(window, false);
让我们在状态栏和导航栏后面绘制。现在状态栏按预期工作,但导航栏隐藏了部分 UI。我需要导航栏处于旧状态,而不是被绘制在下面。有任何想法吗?
为了完整性
compileSdkVersion 31
minSdkVersion 23
targetSdkVersion 31