Android 应用中 v21 的导航栏和状态栏颜色(无主题库)

Posted

技术标签:

【中文标题】Android 应用中 v21 的导航栏和状态栏颜色(无主题库)【英文标题】:Navigationbar and statusbar color for v21 in Android app (no theme libraries) 【发布时间】:2021-09-12 17:44:29 【问题描述】:

我正在开发一些不是我创建的应用程序,我想为 API 21 及更高版本设置导航栏和通知栏颜色。应用程序的主题是纯 XML,没有新的应用程序主题库。我什至可以设置那些具有如此奇怪的主题设置并仅使用 xml 的颜色吗?有人可以解释一下菜鸟友好的东西在哪里添加吗?

我尝试了各种各样的东西

<item name="android:navigationBarColor">@color/theme_color</item>

但我似乎总是把事情搞糊涂。


我只有themes.xml

    <?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.phttpp.TitleBar" parent="android:Theme">
    <item name="android:windowTitleBackgroundStyle">@style/windowTitleBackgroundStyle</item>
    <item name="android:windowTitleStyle">@style/windowTitleStyle</item>
    <item name="android:windowTitleSize">50dip</item>
  </style>
  <style name="Theme.dialog.TitleBar" parent="@android:style/Theme.Dialog">
    <item name="android:windowTitleStyle">@style/windowTitleStyle</item>
    <item name="android:windowTitleSize">50dip</item>
  </style>
</resources>

values 文件夹中的styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="windowTitleBackgroundStyle">
    <item name="android:background">#00BCD4</item>
  </style>
  <style name="windowTitleStyle">
    <item name="android:textColor">#FFFFFF</item>
    <item name="android:padding">12dip</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">16sp</item>
    <item name="android:background">#00BCD4</item>
    <item name="android:maxLines">1</item>
  </style>
</resources>

【问题讨论】:

【参考方案1】:

在我的情况下,在 theme.xml 中添加这些行

<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
     ...
     colors and other stuff
     ...
     <!-- Status bar color. -->
     <item name="android:statusBarColor" >@color/my_color</item>
     <item name="android:fitsSystemWindows">true</item>
     <item name="android:windowLightStatusBar">true</item>
     <!-- Navigation bar color. -->
     <item name="android:navigationBarColor">@color/my_color</item>
</style>

【讨论】:

谢谢,但这对我不起作用,并且 android:windowLightStatusBar 为 true 使状态栏内容隐藏,它变成一个黑条。完全没有颜色变化。【参考方案2】:

我找到了适用于 API21 及更高版本的解决方案。 我没有更改主题和样式的任何内容,但我将 colors.xml 添加到 /values-v21

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#00BCD4</color>
    <color name="colorPrimaryDark">#008394</color>
    <color name="colorAccent">#33c9dc</color>
    <color name="colorGray">#e0e0e0</color>
</resources>

并将其添加到我的主要活动中,以在我的 Java 代码中进行 onCreate

    if (Build.VERSION.SDK_INT >= 21) 
        Window window = this.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));
        getWindow().setNavigationBarColor(getResources().getColor(R.color.colorGray));
    

【讨论】:

以上是关于Android 应用中 v21 的导航栏和状态栏颜色(无主题库)的主要内容,如果未能解决你的问题,请参考以下文章

Android 显示、隐藏状态栏和导航栏

系统覆盖不覆盖状态栏和导航栏 Android

Android 12系统源码_SystemUIDisplayPolicy构建状态栏和导航栏视图窗口区域坐标

android -------- 沉浸式状态栏和沉浸式导航栏(ImmersionBar)

iOS导航栏和状态栏

Android基础篇 显示隐藏状态栏和导航栏