Change status bar text color when primaryDark is white

AndroidAndroid StylesAndroid Statusbar

Android Problem Overview


I am trying to reproduce the behaviour of Google Calendar application: enter image description here

but I have not found a way to change the status text color. If i set the colorPrimaryDark as white I cannot see the icons neither text of status bar due their color is white as well.

Is there any way to change the status bar text color?

Android Solutions


Solution 1 - Android

I'm not sure what API level your trying to target, but if you can use API 23 specific stuff, you can add the following to your AppTheme styles.xml:

<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightStatusBar">true</item>

when android:windowLightStatusBar is set to true, status bar text color will be able to be seen when the status bar color is white, and vice-versa when android:windowLightStatusBar is set to false, status bar text color will be designed to be seen when the status bar color is dark.

Example:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <!-- Status bar stuff. -->
    <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    <item name="android:windowLightStatusBar">true</item> 
</style>

Solution 2 - Android

you can do that programmatically like this answer

just add this

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

Solution 3 - Android

it's very simple:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//  set status text dark
getWindow().setStatusBarColor(ContextCompat.getColor(BookReaderActivity.this,R.color.white));// set status background white

and vice versa:

getWindow().setStatusBarColor(ContextCompat.getColor(BookReaderActivity.this, R.color.black));
View decorView = getWindow().getDecorView(); //set status background black 
decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); //set status text  light

Solution 4 - Android

People still not getting proper answer for API level 21+ (prolly even lower).
Here it is:

Kotlin:

// deprecated
// WindowInsetsControllerCompat(<window>, <view>).isAppearanceLightStatusBars = Boolean
ViewCompat.getWindowInsetsController(<view>)?.isAppearanceLightStatusBars = Boolean

Java:

// deprecated
// new WindowInsetsControllerCompat(<window>, <view>).setAppearanceLightStatusBars(boolean)
ViewCompat.getWindowInsetsController(<view>).setAppearanceLightStatusBars(boolean)

You can get window directly from your activity, and use any view for view

for example:

Window window = Activity.getWindow();
View view = window.getDecorView();

You need androidx.core for this

Solution 5 - Android

Following @Jon's answer I would update it a little but on new apis. On new apis with themes and night themes (dark mode) I would do it by adding the v23/styles.xml and set the status bar background and text color there:

<item name="android:statusBarColor">@color/lightColor</item>
<item name="android:windowLightStatusBar">true</item>

And in the night/styles.xml:

<item name="android:statusBarColor" tools:targetApi="l">@color/darkColor</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>

The default styles.xml wouldn't contain any of this code, or just this, but remember to not set it to light:

<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>

This way we are setting the light background (and text color) for status bar but only for devices with api 23+. On devices <23 background will not be changed, as I think this is something that we dont want knowing that the text color will stay white. The dark theme was added on API 29, so we don't have to be afraid of dark theme on api 21 ;)

The drawback of this however is that we are adding another file that we will need to remember to manage.

Solution 6 - Android

As previous, the SYSTEM_UI_FLAG_LIGHT_STATUS_BAR do the work in my case, don't forget to set for higher than API 22.

add this to oncreate after the setContentView:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}

Solution 7 - Android

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//  set status text dark

getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this,R.color.colorPrimaryDark));// set status background white

It works for me

Solution 8 - Android

Try this once.

In your activity onCreate() method, paste the following code.

try {
        if (android.os.Build.VERSION.SDK_INT >= 21) {
                Window window = getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_red));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

Note: color_red - is the status bar colour.

Solution 9 - Android

In your activity onCreate() method, paste the following code after the setContentView(R.layout.activity_generic_main);

Here is the sample code below.

public class GenericMain extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_generic_main);
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

    }
}

Solution 10 - Android

Try this if not splash page

getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getActivity().getWindow().setNavigationBarColor(ContextCompat.getColor(context, R.color.white));
getActivity().getWindow().setStatusBarColor(ContextCompat.getColor(context, R.color.white));

Solution 11 - Android

For anyone in the future looking to change status bar color from white programmatically in a fragment and back to primary dark when leaving fragment for minimum api 21< 23 in android using Java

private void updateStatusBar(boolean isEnter){

    Window window = requireActivity().getWindow();

    int color = ContextCompat.getColor(requireActivity(),R.color.colorAlertDialog);

    if(isEnter) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        else
            clearDecorFlags(window);
    }
    else {
        color = ContextCompat.getColor(requireActivity(),R.color.colorPrimaryDark);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            window.getDecorView().setSystemUiVisibility(window.getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        else
            clearDecorFlags(window);
    }
    window.setStatusBarColor(color);
}

private void clearDecorFlags(Window window){
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
}

Solution 12 - Android

So it's a bit different in case of kotlin

//for Dark status bar icon with white background

    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
            getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.white))    
    
             
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv())
            getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.black))

 // for dark background and light theme colours of icon.

Solution 13 - Android

To have a white status bar and black text color do this (Kotlin):

In the onCreate function of your main activity add this

val window: Window = window
WindowInsetsControllerCompat(window,window.decorView).isAppearanceLightStatusBars = true

In resoursces/styles.xml add this

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:statusBarColor">#ffffff</item> <!-- this line sets the status bar color (in my case #ffffff is white) -->
<!-- the following lines are not required -->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimary</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

This works with API level 21 as well.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMarcFornView Question on Stackoverflow
Solution 1 - AndroidJonView Answer on Stackoverflow
Solution 2 - AndroidMycoolaView Answer on Stackoverflow
Solution 3 - AndroidVasily GView Answer on Stackoverflow
Solution 4 - AndroidAceView Answer on Stackoverflow
Solution 5 - AndroidM. WojcikView Answer on Stackoverflow
Solution 6 - AndroidMaherView Answer on Stackoverflow
Solution 7 - AndroidMudassarView Answer on Stackoverflow
Solution 8 - AndroidSurendar DView Answer on Stackoverflow
Solution 9 - AndroidAdnanView Answer on Stackoverflow
Solution 10 - Androiduser5071155View Answer on Stackoverflow
Solution 11 - AndroidAyiaView Answer on Stackoverflow
Solution 12 - AndroidAman ThakurView Answer on Stackoverflow
Solution 13 - AndroidZoe LubanzaView Answer on Stackoverflow