Android M Light And Dark Status Bar Programmatically - How To Make It Dark Again?


Answer :

The solution posted by @Aracem is valid but, doesn't work if you try change also the background color of the status bar. In my case I do it in the following way.

To enable windowLightStatusBar(programatically,inside a Utils class for example):

 public static void setLightStatusBar(View view,Activity activity){               if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                  int flags = view.getSystemUiVisibility();                 flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;                 view.setSystemUiVisibility(flags);                 activity.getWindow().setStatusBarColor(Color.WHITE);              } } 

To restore to StatusBar to the previous state:

  public static void clearLightStatusBar(Activity activity) {         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {             Window window = activity.getWindow();             window.setStatusBarColor(ContextCompat                  .getColor(activity,R.color.colorPrimaryDark));          }     } 

Restoring the color of the status bar is enough, it restores also the icons colors. VERY IMPORTANT: The restore operation will not occur until the view used in setLightStatusBar(View view..) dissapears(that is, view.getVisibility()==GONE|INVISIBLE) from the screen.


According to Nick Butcher's project "Plaid"

public static void clearLightStatusBar(@NonNull View view) {     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {         int flags = view.getSystemUiVisibility();         flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;         view.setSystemUiVisibility(flags);     } } 

You can find this file here.


I base on @Aracem and @Carlos Hernández Gil but I think it will easy to understand if we use bitwise XOR (^ operator in Java)

private void setLightStatusBar(Activity activity) {     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {         int flags = activity.getWindow().getDecorView().getSystemUiVisibility(); // get current flag         flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;   // add LIGHT_STATUS_BAR to flag         activity.getWindow().getDecorView().setSystemUiVisibility(flags);          activity.getWindow().setStatusBarColor(Color.GRAY); // optional     } }  private void clearLightStatusBar(Activity activity) {     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {         int flags = activity.getWindow().getDecorView().getSystemUiVisibility(); // get current flag         flags = flags ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; // use XOR here for remove LIGHT_STATUS_BAR from flags         activity.getWindow().getDecorView().setSystemUiVisibility(flags);         activity.getWindow().setStatusBarColor(Color.GREEN); // optional     } } 

Explain

First, look at SYSTEM_UI_FLAG_LIGHT_STATUS_BAR and setSystemUiVisibility

/**  * Flag for {@link #setSystemUiVisibility(int)}: Requests the status bar to draw in a mode that  * is compatible with light status bar backgrounds.  */ public static final int SYSTEM_UI_FLAG_LIGHT_STATUS_BAR = 0x00002000;  public void setSystemUiVisibility(int visibility) {     if (visibility != mSystemUiVisibility) {         mSystemUiVisibility = visibility;         ...     } } 

I think 2 lines code below is quite hard to understand

flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; // for set light status bar flags = flags ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; // for clear light status bar 

At first look, I just think we can use simple like

flags = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; // for set light status bar flags = 0; // for clear light status bar (0 <=> LIGHT_STATUS_BAR <=> default systemUiVisibility) 

But we should use | and ^ because
Example, we want to set both status bar and navigationbar to light, then we will use

flags = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; activity.getWindow().getDecorView().setSystemUiVisibility(flags); 

When we don't want status bar is light anymore, we can use

flags = View.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; activity.getWindow().getDecorView().setSystemUiVisibility(flags); 

OR

flags = activity.getWindow().getDecorView().getSystemUiVisibility(); flags = flags ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;  activity.getWindow().getDecorView().setSystemUiVisibility(flags); 

To know more why we use | and ^, I think the tutorial below may help https://medium.com/@JakobUlbrich/flag-attributes-in-android-how-to-use-them-ac4ec8aee7d1 Here is my understand. Hope this help


Comments

Popular posts from this blog

Converting A String To Int In Groovy

"Cannot Create Cache Directory /home//.composer/cache/repo/https---packagist.org/, Or Directory Is Not Writable. Proceeding Without Cache"

Android How Can I Convert A String To A Editable