使用AppCompat ActionBarActivity更改状态栏颜色

tyc*_*czj 140 android android-5.0-lollipop android-toolbar

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

我意识到在5.0你可以使用,Window.setStatusBarColor()ActionBarActivity没有这个.

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

mat*_*ash 395

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

我想以编程方式更改状态栏颜色(并提供设备具有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);
}
Run Code Online (Sandbox Code Playgroud)

刚试过这个,ActionBarActivity它可以正常工作.


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

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
Run Code Online (Sandbox Code Playgroud)

  • @ code578841441实际上,这不应该发生.编译时内联常量. (11认同)
  • @ code578841441:那是因为您正在使用较旧的SDK进行编译.即使你有较旧的API版本限制(即`<uses-sdk ...>`元素的`minSdkVersion`和/或`targetSdkVersion`属性),你应该总是努力用最新的Android SDK编译*. (4认同)
  • 我还必须调用getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 使它工作 (3认同)

Ari*_*Roy 55

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

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

注意:您还可以将此属性与材质主题一起使用.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

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));
}
Run Code Online (Sandbox Code Playgroud)

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

如果您有任何问题,请试一试并告诉我.希望能帮助到你.


Jst*_*wll 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" />
Run Code Online (Sandbox Code Playgroud)

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

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

Kis*_*nki 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
}
 
Run Code Online (Sandbox Code Playgroud)

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

changeStatusBarColor(
        ContextCompat.getColor(
            context,
            R.color.black
        ), false
    )
Run Code Online (Sandbox Code Playgroud)

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