Android M Light and Dark status bar programmatically - how to make it dark again?

前端 未结 10 1639
自闭症患者
自闭症患者 2020-12-24 10:49

In the Android M we have ability to make status bar icons dark. To do that we can specify attribute in the theme\'s xml:



        
相关标签:
10条回答
  • 2020-12-24 11:19

    There is a slight change in API 30 of the SDK and now the light status bar appearance is controlled by WindowInsetsController, which can be obtained from a Window. Below is a sample method (within an Activity) in Kotlin, combining the new API with the previously used View.setSystemUiVisibility for older Android SDK versions. Bear in mind that this only changes the system icons appearance of the status bar and the actual color of the status bar can still be set by Window.setStatusBarColor.

    @Suppress("DEPRECATION")
    private fun setSystemUiLightStatusBar(isLightStatusBar: Boolean) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                val systemUiAppearance = if (isLightStatusBar) {
                    WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
                } else {
                    0
                }
                window.insetsController?.setSystemBarsAppearance(systemUiAppearance,
                                                                 WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
            } else {
                val systemUiVisibilityFlags = if (isLightStatusBar) {
                    window.decorView.systemUiVisibility or SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
                } else {
                    window.decorView.systemUiVisibility and SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
                }
                window.decorView.systemUiVisibility = systemUiVisibilityFlags
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-24 11:20
    /**
     * Changes color of the status bar icons
     * @param isLight if true - shows dark icons, light else
     */
    fun setStatusBarUiTheme(activity: Activity?, isLight: Boolean) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity?.window?.decorView?.let {
                it.systemUiVisibility = if (isLight)
                    it.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR // dark icons
                else
                    it.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() // light icons
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-24 11:24

    Based on @phan-van-linh answer, I wrote this class for Xamarin Android

    public static class ActivityExtensions
    {
        public static void SetLightStatusBar(this Activity activity)
        {
            int flags = (int)activity.Window.DecorView.SystemUiVisibility; // get current flag
            flags |= (int)SystemUiFlags.LightStatusBar;   // add LIGHT_STATUS_BAR to flag
            activity.Window.DecorView.SystemUiVisibility = (StatusBarVisibility)flags;
            //activity.Window.SetStatusBarColor(Color.GRAY); // optional
        }
    
        public static void ClearLightStatusBar(this Activity activity)
        {
            int flags = (int)activity.Window.DecorView.SystemUiVisibility; // get current flag
            flags = flags ^ (int)SystemUiFlags.LightStatusBar; // use XOR here for remove LIGHT_STATUS_BAR from flags
            activity.Window.DecorView.SystemUiVisibility = (StatusBarVisibility)flags;
            //activity.Window.setStatusBarColor(Color.GREEN); // optional
        }
    }
    
    0 讨论(0)
  • 2020-12-24 11:26

    Set blue background status bar with light text color kotlin version

    fun setBlueStatusBarColor(window: Window, context: Context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                window.statusBarColor = context.getColor(R.color.colorBlue)
            }else {
                window.statusBarColor = context.resources.getColor(R.color.colorBlue)
            }
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                var flags: Int = window.decorView.systemUiVisibility
                flags = flags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
                window.decorView.systemUiVisibility = flags
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-24 11:31

    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.

    0 讨论(0)
  • 2020-12-24 11:31

    i will make some changes in above answers.

    make a class

     public class DarkStatusBar {
        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);
            }
        }
    }
    

    and Call it wherever you want like this

            Window window = getWindow();
            View view = window.getDecorView();
            DarkStatusBar.setLightStatusBar(view,this);
    
    0 讨论(0)
提交回复
热议问题