使用 AppCompat ActionBarActivity 更改状态栏颜色

问题描述 投票:0回答:11

在我的一项活动中,我使用

Palette
更改了工具栏颜色。但在使用
ActionBarActivity
的 5.0 设备上,
status bar
颜色是我的活动主题中
colorPrimaryDark
的颜色,所以我有 2 种截然不同的颜色,看起来不太好。

我意识到在5.0中你可以使用

Window.setStatusBarColor()
但是
ActionBarActivity
没有这个。

所以我的问题是在5.0中如何使用

ActionBarActivity
更改状态栏颜色?

android android-5.0-lollipop android-toolbar
11个回答
475
投票

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

我想以编程方式更改状态栏颜色(并且前提是设备具有 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>

68
投票

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

  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>
  1. 您可以使用 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 文件中定义此颜色。


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 xtras ndroid\支持 7 ppcompat es alues ttrs.xml)


8
投票

只需将此函数粘贴到您保留所有其他常用函数的 Utils 类中即可。

fun Activity.changeStatusBarColor(color: Int, isLight: Boolean) {
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    window.statusBarColor = color

    WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightStatusBars = isLight
}
 

并从任何地方使用它,如下所示:

changeStatusBarColor(
        ContextCompat.getColor(
            context,
            R.color.black
        ), false
    )

注意,这里我还分别管理了状态栏的深色和浅色颜色,以管理状态栏的图标和文本颜色。


3
投票

[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
    }
}

2
投票

试试这个, 我用过这个,它与 v21 配合得很好。

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

0
投票

感谢上述答案,在这些答案的帮助下,经过对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 推荐。


0
投票

申请中

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

in

Theme.AppCompat.Light.DarkActionBar
对我不起作用。诀窍是,像往常一样在 styles.xml 中给出
colorPrimaryDark
android:colorPrimary

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

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


0
投票

将此

kotlin
代码添加到
OnCreate()
Activity
Fragment
:

  if (Build.VERSION.SDK_INT >= 21) {
            val window: Window = requireActivity().window
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
            window.statusBarColor = resources.getColor(R.color.very_light_pink)
        }

0
投票

如果您在 Android 中使用 Kotlin,则可以实现这一点:

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.statusBarColor = Color.WHITE

0
投票
fun Activity.setStatusBarColor(@ColorRes colorResId: Int) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        val window = window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.statusBarColor = ContextCompat.getColor(this, colorResId)
    }
}
Create Simple Kotlin Extension and pass color 
        setStatusBarColor(R.color.toolbar_stroke)
© www.soinside.com 2019 - 2024. All rights reserved.