如何在Android中更改状态栏颜色?


427

首先,它不是重复的,如如何更改android状态栏的背景颜色

如何更改状态栏颜色,该颜色应与导航栏中的颜色相同。

我希望状态栏颜色与导航栏颜色相同

在此处输入图片说明


2
只有在kitkat @MarkBuikema之后才有可能
codercat 2014年

4
正如Niels所建议的那样,自v21以来就有一个THEME属性android:statusBarColor。您只需将其添加到中即可values-v21/styles.xml
2016年

@MarkBuikema这与根访问有什么关系!
史蒂夫·莫雷兹

Answers:


624

Android 5.0 Lollipop引入了Material Design主题,colorPrimaryDark该主题会根据主题的值自动为状态栏着色。

这是支持设备预棒棒糖感谢库支持-V7-程序兼容性起价版本21. 博文关于支持程序兼容性V21从克里斯巴内斯

在此处输入图片说明

在Android开发者官方网站上了解有关Material Theme的更多信息


29
由于某种原因,colorPrimaryDark属性对我不起作用。在仿真器v21上尝试过
2014年

3
它的工作原理是您必须在模拟器上而不是在布局预览上看到更改[它在那里没有显示]
Mightian 2014年

6
在API 18仿真器上,colorPrimaryDark都不适合我。摘自有关appcompat的链接文章:“在较旧的平台上,AppCompat会在可能的情况下模拟颜色主题。目前,这仅限于为操作栏和某些小部件着色。”
亚当·约翰斯

12
如何在状态栏中更改字体颜色?文档没有对此说任何话。
Scott Biggs 2015年

我尝试了相同的方法。它可以在大多数设备上完美运行,但是我拥有运行OS 5.0.1的三星galaxy s4,并且在此手机状态栏中,颜色为黑色。一旦我转到另一个活动,然后又回到上一个活动,我的状态栏颜色将更改为应用程序主题颜色。发生这种情况的任何原因
Hitesh Kamani

364

更新:

棒糖:

public abstract void setStatusBarColor (int color)

在API级别21中添加

Android Lollipop带有更改应用程序中状态栏颜色的功能,以提供更身临其境的用户体验并与Google的风格保持一致Material Design Guidelines

这是您可以使用中window.setStatusBarColor引入的新方法更改状态栏的颜色的方法API level 21

更改状态栏的颜色还需要在Window上设置两个其他标志。您需要添加FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS标志并清除FLAG_TRANSLUCENT_STATUS标志。

工作代码:

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

官方开发人员参考:setStatusBarColor(int)

示例:无处不在的材料设计

Chris Banes Blog- appcompat v21:棒棒糖之前设备的材料设计!

在此处输入图片说明

transitionName该视图背景会android:status:background


2
有向后兼容性的解决方案吗?
亚当·赫维兹

作为由尼尔斯答案注意:您也可以通过设置来配置通过主题/风格的状态栏的颜色android:statusBarColor在你的values-v21/styles.xml每个文件androiddocs.com/training/material/theme.html像这样<item name="android:statusBarColor">@color/primary_color</item>
JL西

4
我可以将状态栏颜色更改为白色,但是看不到batery之类的通知图标,我该如何解决?
MNFS

1
你不知道你到底有多少帮助了我..
阿布舍克Dhyani

222

将其放在您的values-v21 / styles.xml中,以在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>

34
这要求使用最低API 21
罗马

49
这可能就是为什么他建议将其放入values-v21 / styles.xml ;-)似乎是迄今为止最准确的答案!
莱维特

但这仍然发出警告!!?
Nihal Sharma

compat的功能是什么?状态栏
blackHawk '18年

targeApi如果要维护单个样式文件,则可以添加属性。阅读我的答案以获取参考stackoverflow.com/a/48565459/4291272
Faisal Shaikh,

50

这是没有任何库即可执行此操作的一种非常简单的方法:如果不支持操作系统版本(在kitkat下),则什么也没发生。我这样做:

  1. 在我的xml中,我将此视图添加到顶部:
<View
        android:id="@+id/statusBarBackground"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

然后我做了这个方法:

 public void setStatusBarColor(View statusBar,int color){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           Window w = getWindow();
           w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //status bar height
           int actionBarHeight = getActionBarHeight();
           int statusBarHeight = getStatusBarHeight();
           //action bar height
           statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
           statusBar.setBackgroundColor(color);
     }
}

您也需要同时使用这两种方法来获得操作栏和状态栏的高度:

public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
    {
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

然后,您唯一需要的是此行来设置状态栏颜色:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

1
我应该在哪里放置view元素?它应该位于主要布局的顶部吗?
EmilReñaEnriquez 2015年

是。在您的xml中。在它的顶部。
itzhar 2015年

注意:仅适用于android> = 19 API。就我而言,我需要从16开始的支持
Anton Kizema 2015年

setStatusBarColor(findViewById(android.R.id.statusBarBackground),getResources()。getColor(android.R.color.white));
AndroidLad

34

正如@Niels所说,您必须将其放置在values-v21 / styles.xml中:

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

但是,tools:targetApi="lollipop"如果要使用单个styles.xml,请添加以下内容:

<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>

3
非常感谢“ targetApi”。我不喜欢将主题分布在多个文件中。:)
plexus

31

好了,Izhar解决方案还可以,但是就我个人而言,我试图避免看起来像这样的代码:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do what you need for this SDK
};

同样,我也不喜欢重复代码。在您的答案中,我必须在所有活动中添加以下代码行:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

因此,我采用了Izhar解决方案,并使用XML来获得相同的结果:为StatusBar status_bar.xml创建布局

<View xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="@dimen/statusBarHeight"
     android:background="@color/primaryColorDark"
     android:elevation="@dimen/statusBarElevation">

请注意高度和海拔高度属性,这些属性将在更下方的值-v19,值-v21中设置。

使用include main_activity.xml将此布局添加到您的活动布局中:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Black" >

<include layout="@layout/status_bar"/>
<include android:id="@+id/app_bar" layout="@layout/app_bar"/>
//The rest of your layout       
</RelativeLayout>

对于工具栏,添加上边距属性:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:elevation="@dimen/toolbarElevation"
android:layout_marginTop="@dimen/appBarTopMargin"
android:textDirection="ltr"
android:layoutDirection="ltr">

在您的appTheme style-v19.xml和styles-v21.xml中,添加windowTranslucent属性:

styles-v19.xml,v21:

<resources>
<item name="android:windowTranslucentStatus">true</item>
</resources>

最后,在您的dimens-v19,dimens-v21上,添加工具栏topMargin的值和statusBarHeight:dimens.xml的高度,使其小于KitKat:

<resources>
<dimen name="toolbarElevation">4dp</dimen>
<dimen name="appBarTopMargin">0dp</dimen>
<dimen name="statusBarHeight">0dp</dimen>
</resources>

对于KitKat及更高版本,状态栏的高度始终为24dp dimens-v19.xml:

<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>

Lolipop的dimens-v21.xml,如果需要,只需添加高度:

<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>

这是Jellybean KitKat和Lollipop的结果:

在此处输入图片说明


因此,您无需将检查代码放入XML中。您的解决方案将适用于Kitkat,就像他得到的一样。
Android开发人员

26

您可以使用以下简单代码:

科特林的一线客:

window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)

Java和手动版本检查的原始答案:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light, this.getTheme()));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light));
}

您可以使用进一步简化此操作ContextCompat。在科特林,它就是这样:window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)
sunadorer '19

在撰写本文时,我还没有尝试过kotlin.Why你不编辑答案,我可以批准它:)
史蒂夫·莫雷兹

好主意。我已经包括了我的答案建议作为未来的访客一个简单的参考
sunadorer

状态栏颜色在Build.VERSION_CODES.M上方更改。不能在棒棒糖以下工作
穆罕默德·哈里斯

@MuhammedHaris确实有效。您使用的是Kotlin还是Java代码?
史蒂夫·莫雷兹

23

只需在res / values / styles.xml中创建一个新主题,即可在其中更改状态栏颜色的“ colorPrimaryDark”:

<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/colorGray</item>
</style>

并将AndroidManifest.xml中的活动主题修改为所需的主题,在下一个活动中,可以通过选择原始主题将颜色更改回原始颜色:

<activity
    android:name=".LoginActivity"
    android:theme="@style/AppTheme.GrayStatusBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

这就是您的res / values / colors.xml的样子:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#c6d6f0</color>
    <color name="colorGray">#757575</color>
</resources>

1
我认为这是最简单但最干净的解决方案。无需将最低API级别设置为21,只需进行简单的覆盖即可。值得更多投票。
tahsinRupam

在牛轧糖和api级别设置为19上运行时,此方法不起作用。如果我在清单的应用程序节点下设置了android:theme,它确实起作用。
AndroidDev

18

要更改lolipop的颜色,只需将其添加到您的styles.xml中

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

但请记住,如果您希望状态栏显示浅色,也请添加此行

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

1
谢谢,这也是有用的答案。
安德鲁·格罗

16

您可以使用此功能更改状态栏颜色。在android L上工作的意思是API 21或更高版本,需要一个颜色字符串,如"#ffffff"

private void changeStatusBarColor(String color){
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.parseColor(color));
    }
}

15

我有以下要求:以编程方式更改状态栏的颜色,使其保持透明,以允许导航抽屉在透明状态栏上进行绘制。

我无法使用API​​进行操作

getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)

如果您在此处检查堆栈溢出,则在该行代码之前的每个人都将状态栏的透明度设置为稳定

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

我可以像这样管理状态栏的颜色和透明度

  • Android 4:您无能为力,因为您无法通过API管理状态栏的颜色...唯一可以做的就是将状态栏设置为半透明,并在状态下移动用户界面的彩色元素酒吧。为此,您需要玩

    android:fitsSystemWindows="false"

    在您的主要布局中。这使您可以在状态栏下绘制布局。然后,您需要在主布局的顶部进行一些填充。

  • Android 5及更高版本:您必须使用

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

    这允许导航抽屉与状态栏重叠。

    然后,要更改颜色以使状态栏保持透明,您必须使用

    drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))

    这样定义了drawerLayout

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

它对我没有作用<item name="android:windowDrawsSystemBarBackgrounds">true</item>。无论如何,经过几天的搜索,我发现了一些确实有用的功能(目前仅在Lolllipop上进行了测试)。感谢
DenisGL '18

我遇到同样的问题,您的回答帮助我解决了这个问题。
A.Gun

7

将“值”中colors.xml中的colorPrimary编辑为希望状态栏为的颜色。例如:

   <resources>
<color name="colorPrimary">#800000</color> // changes the status bar color to Burgundy
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#FF0000</color>
<color name="white">#FFFFFF</color>
<color name="cream">#fffdd0</color>
<color name="burgundy">#800000</color>


7

要更改状态栏的颜色,请转到 res/values-v21/styles.xml和状态栏的颜色

<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">#0000FF</item>
    </style>
</resources>

嘿,你能帮我吗?我不了解Android,现在无法开始学习。我有一个简单的应用程序女巫运行html文件。我很想更改状态栏的颜色,因为#000的顶部和底部对我的脸色来说太可怕了。但是我无法,我什至找不到styles.xml文件...如果我可以将我的apk发送给您,而您将它设置为我,我将不胜感激!
Thiago Soubra

6

如果您要通过编程方式更改状态栏颜色(并在设备具有Android 5.0的情况下)。这是一种从任何Activity更改statusBarColor的简单方法, 并且在不同片段具有不同状态栏颜色时非常简单的方法。

 /**
 * @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
}

5

如果要在Android 4.4及更高版本上使用,请尝试此操作。我指的是Harpreet的答案和此链接。Android和透明状态栏

首先,在Activity的onCreate方法中调用setStatusBarColored方法(我将其放在util类中)。我在这里使用图像,您可以将其更改为使用颜色。

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

之前: 之前

后: 后

状态栏的颜色已更改,但是导航栏已被切除,因此我们需要在onCreate方法中设置导航栏的边距或偏移量。

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

然后状态栏将如下所示。

状态栏


4

这就是在KitKat上为我工作的结果,并且效果很好。

public static void setTaskBarColored(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);
            //status bar height
            int statusBarHeight = Utilities.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.setBackgroundColor(context.getResources().getColor(R.color.colorPrimaryTaskBar));
        }
    }

2

另一种解决方案:

final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);

这是否可以在状态栏位于屏幕底部的平板电脑上使用?
guy.gc

6
什么是“ w”和“ UiUtil”?
Manav Patadia

2

colorPrimaryDark更改为所需的颜色到res / values / styles.xml文件中

    <resources>
        <color name="colorPrimary">#800000</color>
        <color name="colorPrimaryDark">#303F9F</color> //This Line
        <color name="colorAccent">#FF4081</color>
        <color name="red">#FF0000</color>
        <color name="white">#FFFFFF</color>
       <color name="cream">#fffdd0</color>
       <color name="burgundy">#800000</color>
    </resources>
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.