195

In my app I need to change the bottom navigation bar color. I watched many post but cant find with the solution. I am using appCompat library.

enter image description here

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>
Mikev
  • 2,012
  • 1
  • 15
  • 27
user3065901
  • 4,678
  • 11
  • 30
  • 52

11 Answers11

370

It can be done inside styles.xml using

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

or

window.setNavigationBarColor(@ColorInt int color)

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

Note that the method was introduced in Android Lollipop and won't work on API version < 21.

The second method (works on KitKat) is to set windowTranslucentNavigation to true in the manifest and place a colored view beneath the navigation bar.

Pankaj Lilan
  • 4,245
  • 1
  • 29
  • 48
Zielony
  • 16,239
  • 6
  • 34
  • 39
80

Here is how to do it programatically:

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

Using Compat library:

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

Here is how to do it with xml in the values-v21/style.xml folder:

<item name="android:navigationBarColor">@color/your_color</item>
Bolling
  • 3,954
  • 1
  • 27
  • 29
  • 2
    This is a strange option! I have an app that makes the navbar black with black buttons making it impossible to see the home/back/recent soft buttons... – JohnyTex Aug 13 '18 at 13:45
42

Here are some ways to change Navigation Bar color.

By the XML

1- values-v21/style.xml

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

Or if you want to do it only using the values/ folder then-

2- values/style.xml

<resources xmlns:tools="http://schemas.android.com/tools">

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

You can also change navigation bar color By Programming.

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

By Using Compat Library-

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

please find the link for more details- http://developer.android.com/reference/android/view/Window.html#setNavigationBarColor(int)

D_Alpha
  • 4,039
  • 22
  • 36
10

You can add the following line in the values-v21/style.xml folder:

<item name="android:navigationBarColor">@color/theme_color</item>
Pang
  • 9,564
  • 146
  • 81
  • 122
Pratik Butani
  • 60,504
  • 58
  • 273
  • 437
9

For people using Kotlin you can put this in your MainActivity.kt:

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

With window being:

val window: Window = this@MainActivity.window

Or you can put this in your themes.xml or styles.xml (requires API level 21):

<item name='android:navigationBarColor'>@color/yourColor</item>
Amy
  • 1,114
  • 13
  • 35
5
  1. Create Black Color: <color name="blackColorPrimary">#000001</color> (not #000000)
  2. Write in Style: <item name="android:navigationBarColor" tools:targetApi="lollipop">@color/blackColorPrimary</item>

Problem is that android higher version make trasparent for #000000

Fariz Aghayev
  • 649
  • 5
  • 17
  • If you're doing everything correctly and it STILL doesn't work, this is what worked for me. It doesn't seem to be mentionned anywhere else that #000000 won't work. – Matija Martic Aug 05 '20 at 17:37
3

Put these on your theme

themes.xml: < item name="android:navigationBarColor" tools:targetApi="21">yourcolor < /item>

Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129
Haris Khan
  • 41
  • 2
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Feb 05 '22 at 05:14
2

You can also modify your theme using theme Editor by clicking :

Tools -> Android -> Theme Editor

Then, you don't even need to put some extra content in your .xml or .class files.

Lelouch
  • 21
  • 1
  • 3
2

@Zielony's answer above works,

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

Also added the following based on @Alexey Ozerov's comment

true

but adding this screen shot in case anyone's new and having trouble finding styles.xml and colors.xmlenter image description here

Soubriquet
  • 3,100
  • 10
  • 37
  • 52
1

You can change it directly in styles.xml file \app\src\main\res\values\styles.xml

This work on older versions, I was changing it in KitKat and come here.

1

If you want to set default color of navigationBar, which depends on day or night theme, for example, after setting custom colour in one of the fragments, you need to use this:

requireActivity().window.navigationBarColor = requireContext().getColorFromAttr(android.R.attr.navigationBarColor)
Valentin
  • 400
  • 2
  • 11