使用AppCompat ActionBarActivity更改状态栏颜色


145

在我的一项活动中,我使用更改了工具栏的颜色Palette。但在使用5.0的设备ActionBarActivitystatus bar颜色的颜色我colorPrimaryDark我的活动主题,所以我有2种非常不同的颜色和它看起来并不好。

我意识到在5.0中您可以使用,Window.setStatusBarColor()ActionBarActivity没有此功能。

所以我的问题是在5.0中如何更改状态栏的颜色ActionBarActivity


您是否尝试过使用SystemBarTint lib?github.com/jgilfelt/SystemBarTint
Nikola Despotoski 2014年

Answers:


419

我不确定我是否理解问题。

我想通过编程方式更改状态栏的颜色(并且前提是该设备具有Android 5.0),然后可以使用Window.setStatusBarColor()。活动是来自Activity还是都没有关系ActionBarActivity

只需尝试:

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);
}

刚刚使用进行了测试ActionBarActivity,就可以了。


注意:FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS如果您的values-v21样式文件已经设置了标志,则无需通过编程方式设置标志,方法是:

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>

1
嗯,我getWindow()
没用

当在旧的android系统中找不到代码LOLLIPOP时,这会崩溃。最好使用> = 21
代码511788465541441

12
@ code578841441实际上,这不应该发生。编译时内联常数。
matiash

4
@ code578841441:这是因为您使用的是旧版SDK。即使您有较旧的API版本约束(即元素上的和/或属性),也应始终努力使用最新的Android SDK 进行编译minSdkVersiontargetSdkVersion<uses-sdk ...>
dbm 2014年

3
我还必须调用getWindow()。addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 使它起作用
Philipp E.

61

有多种更改状态栏颜色的方法。

1)使用styles.xml。您可以使用android:statusBarColor属性以简单但静态的方式执行此操作。

注意:您也可以将此属性与Material主题一起使用。

<?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)您可以使用Window类中的setStatusBarColor(int)方法动态地完成此操作。但是请记住,此方法仅适用于API 21或更高版本。因此,请务必进行检查,否则您的应用肯定会在较低的设备中崩溃。

这是此方法的一个有效示例。

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));
}

其中primaryDark是我在应用程序中使用的原色的700色。您可以在colors.xml文件中定义此颜色。

请尝试一下,如果您有任何疑问,请告诉我。希望能帮助到你。


它看起来像window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 不需要-但这对我
有用-bkurzius 2015年

有什么想法为什么编程版本会起作用,而样式版本却不起作用?
安德鲁(Andrew)

在我的情况下,活动的样式已设置了flah translucent_status,因此,如果没有window.clearFlags命令,该样式将不起作用。所以谢谢你!
BMacedo

哇!这应该被接受,回答,添加clearFlags解决我的问题
fanjavaid

9

我认为状态栏颜色尚未在AppCompat中实现。这些是可用的属性:

    <!-- ============= -->
    <!-- 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" />

(来自\ sdk \ extras \ android \ support \ v7 \ appcompat \ res \ values \ attrs.xml


1
如果较旧的OS版本不提供任何修改状态栏的功能,则可能永远不会在AppCompat中实现它。
TheIT

2
<attr name =“ colorPrimaryDark” format =“ color” /> <!-主品牌颜色的深色变体。默认情况下,这是应用于状态栏(通过statusBarColor)和导航栏(通过navigationBarColor)的颜色。->
Soheil Setayeshi

3

试试这个,我用过它,并且在v21上效果很好。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimaryDark">@color/blue</item>
</style>

1

感谢上述答案,并在xamarin.android MVVMCross应用程序进行了一定的研发之后,借助这些答案,以下工作有效

在方法OnCreate中为活动指定的标志

protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        this.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
    }

对于每个MvxActivity,主题均如下所述

 [Activity(
    LaunchMode = LaunchMode.SingleTop,
    ScreenOrientation = ScreenOrientation.Portrait,
    Theme = "@style/Theme.Splash",
    Name = "MyView"
    )]

我的SplashStyle.xml如下所示

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
          <item name="android:statusBarColor">@color/app_red</item>
          <item name="android:colorPrimaryDark">@color/app_red</item>
    </style>
 </resources>

我提到了V7 appcompact。


1

[Kotlin版本]我创建了此扩展程序,该扩展程序还检查所需的颜色是否具有足够的对比度以隐藏系统UI,例如电池状态图标,时钟等,因此我们据此将系统UI设置为白色或黑色。

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

正在申请

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

Theme.AppCompat.Light.DarkActionBar没有为我工作。诀窍是什么,colorPrimaryDark像往常一样 android:colorPrimary在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>

和设置

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

不必在代码中设置状态栏颜色。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.