Change status bar color with AppCompat ActionBarActivity

后端 未结 7 1604
一个人的身影
一个人的身影 2020-11-29 17:04

In one of my Activities, I changed the Toolbar color using Palette. But on 5.0 devices using ActionBarActivity the status bar color i

相关标签:
7条回答
  • 2020-11-29 17:30

    I'm not sure I understand the problem.

    I you want to change the status bar color programmatically (and provided the device has Android 5.0) then you can use Window.setStatusBarColor(). It shouldn't make a difference whether the activity is derived from Activity or ActionBarActivity.

    Just try doing:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.BLUE);
    }
    

    Just tested this with ActionBarActivity and it works alright.


    Note: Setting the FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag programmatically is not necessary if your values-v21 styles file has it set already, via:

        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    
    0 讨论(0)
  • 2020-11-29 17:31

    Applying

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

    in Theme.AppCompat.Light.DarkActionBar didn't worked for me. What did the trick is , giving colorPrimaryDark as usual along with android:colorPrimary in styles.xml

    <item name="android:colorAccent">@color/color_primary</item>
    <item name="android:colorPrimary">@color/color_primary</item>
    <item name="android:colorPrimaryDark">@color/color_primary_dark</item>
    

    and in setting

    if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                    {
                        Window window = this.Window;
                        Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
                    }
    

    didn't had to set statusbar color in code .

    0 讨论(0)
  • 2020-11-29 17:33

    Try this, I used this and it works very good with v21.

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimaryDark">@color/blue</item>
    </style>
    
    0 讨论(0)
  • 2020-11-29 17:41

    I don't think the status bar color has been implemented in AppCompat yet. These are the attributes which are available:

        <!-- ============= -->
        <!-- Color palette -->
        <!-- ============= -->
    
        <!-- The primary branding color for the app. By default, this is the color applied to the
             action bar background. -->
        <attr name="colorPrimary" format="color" />
    
        <!-- Dark variant of the primary branding color. By default, this is the color applied to
             the status bar (via statusBarColor) and navigation bar (via navigationBarColor). -->
        <attr name="colorPrimaryDark" format="color" />
    
        <!-- Bright complement to the primary branding color. By default, this is the color applied
             to framework controls (via colorControlActivated). -->
        <attr name="colorAccent" format="color" />
    
        <!-- The color applied to framework controls in their normal state. -->
        <attr name="colorControlNormal" format="color" />
    
        <!-- The color applied to framework controls in their activated (ex. checked) state. -->
        <attr name="colorControlActivated" format="color" />
    
        <!-- The color applied to framework control highlights (ex. ripples, list selectors). -->
        <attr name="colorControlHighlight" format="color" />
    
        <!-- The color applied to framework buttons in their normal state. -->
        <attr name="colorButtonNormal" format="color" />
    
        <!-- The color applied to framework switch thumbs in their normal state. -->
        <attr name="colorSwitchThumbNormal" format="color" />
    

    (From \sdk\extras\android\support\v7\appcompat\res\values\attrs.xml)

    0 讨论(0)
  • 2020-11-29 17:43

    There are various ways of changing the status bar color.

    1) Using the styles.xml. You can use the android:statusBarColor attribute to do this the easy but static way.

    Note: You can also use this attribute with the Material theme.

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="AppTheme" parent="AppTheme.Base">
            <item name="android:statusBarColor">@android:color/transparent</item>
        </style>
    </resources>
    

    2) You can get it done dynamically using the setStatusBarColor(int) method in the Window class. But remember that this method is only available for API 21 or higher. So be sure to check that, or your app will surely crash in lower devices.

    Here is a working example of this method.

    if (Build.VERSION.SDK_INT >= 21) {
                Window window = getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.setStatusBarColor(getResources().getColor(R.color.primaryDark));
    }
    

    where primaryDark is the 700 tint of the primary color I am using in my app. You can define this color in the colors.xml file.

    Do give it a try and let me know if you have any questions. Hope it helps.

    0 讨论(0)
  • 2020-11-29 17:47

    [Kotlin version] I created this extension that also checks if the desired color has enough contrast to hide the System UI, like Battery Status Icon, Clock, etc, so we set the System UI white or black according to this.

    fun Activity.coloredStatusBarMode(@ColorInt color: Int = Color.WHITE, lightSystemUI: Boolean? = null) {
        var flags: Int = window.decorView.systemUiVisibility // get current flags
        var systemLightUIFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        var setSystemUILight = lightSystemUI
    
        if (setSystemUILight == null) {
            // Automatically check if the desired status bar is dark or light
            setSystemUILight = ColorUtils.calculateLuminance(color) < 0.5
        }
    
        flags = if (setSystemUILight) {
            // Set System UI Light (Battery Status Icon, Clock, etc)
            removeFlag(flags, systemLightUIFlag)
        } else {
            // Set System UI Dark (Battery Status Icon, Clock, etc)
            addFlag(flags, systemLightUIFlag)
        }
    
        window.decorView.systemUiVisibility = flags
        window.statusBarColor = color
    }
    
    private fun containsFlag(flags: Int, flagToCheck: Int) = (flags and flagToCheck) != 0
    
    private fun addFlag(flags: Int, flagToAdd: Int): Int {
        return if (!containsFlag(flags, flagToAdd)) {
            flags or flagToAdd
        } else {
            flags
        }
    }
    
    private fun removeFlag(flags: Int, flagToRemove: Int): Int {
        return if (containsFlag(flags, flagToRemove)) {
            flags and flagToRemove.inv()
        } else {
            flags
        }
    }
    
    0 讨论(0)
提交回复
热议问题