安卓棒棒糖如何改变导航栏颜色

198
在我的应用程序中,我需要更改底部导航栏的颜色。我查看了很多帖子,但找不到解决方案。我正在使用appCompat库。
v21/styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light">
       <item name="android:windowBackground">@drawable/bgpreview</item>
       <item name="android:colorPrimary">@color/MyColor</item>
       <item name="android:colorPrimaryDark">@color/MyColor</item>
       <item name="android:windowContentOverlay">@null</item>
       <item name="android:textColorPrimary">@color/MyColor</item>
       <item name="colorAccent">@color/MyColor</item>
       <!-- darker variant for the status bar and contextual app bars -->
       <item name="android:windowContentTransitions">true</item>
       <item name="android:windowAllowEnterTransitionOverlap">true</item>
       <item name="android:windowAllowReturnTransitionOverlap">true</item>
       <item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
       <item name="android:windowSharedElementExitTransition">@android:transition/move</item>

       <item name="windowActionBar">false</item>
       <item name="android:textAllCaps">false</item>

</style>

你能发布style.xml文件吗?不需要全部,只需要相关的片段。 - Blackbelt
1
我该如何将默认颜色重置回去? - GMX
11个回答

372

可以通过 styles.xml 中的设置实现。

<item name="android:navigationBarColor">@color/theme_color</item>
或者
window.setNavigationBarColor(@ColorInt int color)

http://developer.android.com/reference/android/view/Window.html#setNavigationBarColor(int)

请注意,该方法在Android Lollipop版本中引入,并且在API版本< 21上无法使用。

第二种方法(适用于KitKat)是在清单中将windowTranslucentNavigation设置为true,并在导航栏下放置一个有颜色的视图。


49
还可以改变图标的颜色吗? - Jamsheed Kamarudeen
11
values-21文件夹中添加以下内容:<item name="android:navigationBarColor">@color/theme_color</item>,其中@color/theme_color是指示颜色的变量名。 - Pratik Butani
请确保 (目标 Android 版本) 至少设置为 API 21 - MujtabaFR
2
不要将此代码放入您的样式文件中:<item name="android:windowDrawsSystemBarBackgrounds">false</item>,否则系统状态栏颜色设置将无法生效。 - Alexey Ozerov
6
使用<item name="android:windowLightNavigationBar">true</item>可将 Android 应用程序的导航栏改为浅色模式。 - Peretz30
显示剩余5条评论

81

以下是如何以编程方式完成此操作:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {                
   getWindow().setNavigationBarColor(getResources().getColor(R.color.your_awesome_color));
}

使用Compat库:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.primary));
}

以下是在 values-v21/style.xml 文件夹中使用 XML 的方法:

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

2
这是一个奇怪的选项!我有一个应用程序,将导航栏变成黑色,并使用黑色按钮,使得无法看到主页/返回/最近软件按钮... - JohnyTex

42

以下是更改导航栏颜色的几种方式。

使用XML文件

1- values-v21/style.xml

<item name="android:navigationBarColor">@color/navigationbar_color</item>
如果你只想使用values文件夹来完成,那么-
2- values/style.xml
<resources xmlns:tools="http://schemas.android.com/tools">

<item name="android:navigationBarColor" tools:targetApi="21">@color/navigationbar_color</item>

你也可以通过编程来改变导航栏的颜色

 if (Build.VERSION.SDK_INT >= 21)
    getWindow().setNavigationBarColor(getResources().getColor(R.color.navigationbar_color));

使用Compat库 -

if (Build.VERSION.SDK_INT >= 21) {
    getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.primary));
}
请查看更多详细信息的链接-http://developer.android.com/reference/android/view/Window.html#setNavigationBarColor(int)

我无法使用 tools:targetApi,这个功能已经过时了吗? - winklerrr
1
@winklerrr 这并不过时,请看我的更新答案。 - D_Alpha
如果我决定通过编程方式更改颜色 - 我需要在每个Activity/Fragment中都这样做吗?还是有一个特定的地方我应该这样做?也许是扩展Application类的类中? - winklerrr
1
你需要在每个Activity中这样做,或者你可以为不同的Activity制定不同的样式。 - D_Alpha
在使用 tools:targetApi 时,无需覆盖 styles.xml - Farshad Tahmasbi
在使用tools:targetApi时,无需覆盖styles.xml - Farshad Tahmasbi

10

您可以在 values-v21/style.xml 文件夹中添加以下行:

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

10

对于使用 Kotlin 的人,您可以将以下内容放入 MainActivity.kt 文件中:

window.navigationBarColor = ContextCompat.getColor(this@MainActivity, R.color.yourColor)

window 是指:

val window: Window = this@MainActivity.window

或者您可以将以下内容放入themes.xml或styles.xml文件中(需要API级别21):

<item name='android:navigationBarColor'>@color/yourColor</item>

5
  1. 创建黑色: <color name="blackColorPrimary">#000001</color>(不是#000000)
  2. 以样式书写:<item name="android:navigationBarColor" tools:targetApi="lollipop">@color/blackColorPrimary</item>

问题在于Android的较高版本会将 #000000 变为透明。


如果你已经做了一切正确的事情,但仍然无法正常工作,这是对我有效的解决方法。似乎其他地方没有提到 #000000 不起作用。 - Matija Martic

3
将以下内容添加到您的主题中:
在themes.xml文件中添加:yourcolor
请注意,yourcolor应替换为您想要设置的实际颜色值。

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

2

@Zielony在上面的回答有效,

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

根据 @Alexey Ozerov 的评论,还添加了以下内容

true

不过,为了帮助那些新手且难以找到 styles.xmlcolors.xml,我添加了这张截图enter image description here


2
您可以通过点击以下内容使用主题编辑器修改您的主题:
工具 -> Android -> 主题编辑器
然后,您甚至不需要在.xml或.class文件中添加额外的内容。

不错的提示!对我来说,它就在“工具”->“主题编辑器”下面。 - Sam
现在的主题编辑器已经在3.3版中被移除。 - Jenix

1

如果您想设置导航栏的默认颜色,它将取决于白天或黑夜主题。例如,在其中一个片段中设置自定义颜色后,您需要使用以下代码:

requireActivity().window.navigationBarColor = requireContext().getColorFromAttr(android.R.attr.navigationBarColor)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接