How to change the status bar color in Android?

后端 未结 21 1893
旧时难觅i
旧时难觅i 2020-11-21 16:09

First of all it\'s not a duplicate as in How to change the background color of android status bar

How do I change the status bar color which should be same as in nav

相关标签:
21条回答
  • 2020-11-21 16:34

    If you want to work on Android 4.4 and above, try this. I refer to Harpreet's answer and this link. Android and the transparent status bar

    First, call setStatusBarColored method in Activity's onCreate method(I put it in a util class). I use a image here, you can change it to use a color.

    public static void setStatusBarColored(Activity context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        {
            Window w = context.getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            int statusBarHeight = getStatusBarHeight(context);
    
            View view = new View(context);
            view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            view.getLayoutParams().height = statusBarHeight;
            ((ViewGroup) w.getDecorView()).addView(view);
            view.setBackground(context.getResources().getDrawable(R.drawable.navibg));
        }
    }
    
    public static int getStatusBarHeight(Activity context) {
        int result = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
    

    Before:

    After:

    The color of the status bar has been changed, but the navi bar is cut off, so we need to set the margin or offset of the navi bar in the onCreate method.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT, (int)(this.getResources().getDimension(R.dimen.navibar_height)));
            layoutParams.setMargins(0, Utils.getStatusBarHeight(this), 0, 0);
    
            this.findViewById(R.id.linear_navi).setLayoutParams(layoutParams);
        }
    

    Then the status bar will look like this.

    0 讨论(0)
  • 2020-11-21 16:34

    If you want set custom drawable file use this code snippet

    fun setCustomStatusBar(){
        if (Build.VERSION.SDK_INT >= 21) {
            val decor = window.decorView
            decor.viewTreeObserver.addOnPreDrawListener(object :
                ViewTreeObserver.OnPreDrawListener {
                override fun onPreDraw(): Boolean {
                    decor.viewTreeObserver.removeOnPreDrawListener(this)
                    val statusBar = decor.findViewById<View> 
                      (android.R.id.statusBarBackground)
                    statusBar.setBackgroundResource(R.drawable.bg_statusbar)
                    return true
                }
            })
        }
    }
    
    0 讨论(0)
  • 2020-11-21 16:36

    To change the color for above lolipop just add this to your styles.xml

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

    but remember, if you want to have a light color for the status bar, add this line too

    <item name="android:windowLightStatusBar">true</item>
    
    0 讨论(0)
  • 2020-11-21 16:39

    Update:

    Lollipop:

    public abstract void setStatusBarColor (int color)
    

    Added in API level 21

    Android Lollipop brought with it the ability to change the color of status bar in your app for a more immersive user experience and in tune with Google’s Material Design Guidelines.

    Here is how you can change the color of the status bar using the new window.setStatusBarColor method introduced in API level 21.

    Changing the color of status bar also requires setting two additional flags on the Window; you need to add the FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag and clear the FLAG_TRANSLUCENT_STATUS flag.

    Working Code:

    import android.view.Window;
    

    ...

    Window window = activity.getWindow();
    
    // clear FLAG_TRANSLUCENT_STATUS flag:
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    
    // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    
    // finally change the color
    window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));
    

    Offcial developer reference : setStatusBarColor(int)

    Example :material-design-everywhere

    Chris Banes Blog- appcompat v21: material design for pre-Lollipop devices!

    enter image description here

    The transitionName for the view background will be android:status:background.

    0 讨论(0)
  • 2020-11-21 16:41

    If you want to change the status bar color programmatically (and provided the device has Android 5.0). This is a simple way to change statusBarColor from any Activity and very easy methods when differents fragments have different status bar color.

     /**
     * @param colorId id of color
     * @param isStatusBarFontDark Light or Dark color
     */
    fun updateStatusBarColor(@ColorRes colorId: Int, isStatusBarFontDark: Boolean = true) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val window = window
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
            window.statusBarColor = ContextCompat.getColor(this, colorId)
            setSystemBarTheme(isStatusBarFontDark)
        }
    }
    
    /** Changes the System Bar Theme.  */
    @RequiresApi(api = Build.VERSION_CODES.M)
    private fun setSystemBarTheme(isStatusBarFontDark: Boolean) {
        // Fetch the current flags.
        val lFlags = window.decorView.systemUiVisibility
        // Update the SystemUiVisibility depending on whether we want a Light or Dark theme.
        window.decorView.systemUiVisibility = if (isStatusBarFontDark) lFlags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() else lFlags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    }
    
    0 讨论(0)
  • 2020-11-21 16:42

    Place this is your values-v21/styles.xml, to enable this on Lollipop:

    <resources>
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light">
            <item name="colorPrimary">@color/color_primary</item>
            <item name="colorPrimaryDark">@color/color_secondary</item>
            <item name="colorAccent">@color/color_accent</item>
            <item name="android:statusBarColor">@color/color_primary</item>
        </style>
    </resources>
    
    0 讨论(0)
提交回复
热议问题