如何更改android中的状态栏颜色

时间:2014-03-05 08:27:37

标签: android statusbar android-notifications android-navigation

首先,它不像How to change the background color of android status bar

那样重复

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

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

enter image description here

23 个答案:

答案 0 :(得分:519)

Android 5.0 Lollipop推出了Material Design主题,它根据主题的colorPrimaryDark值自动为状态栏添加颜色。

由于从版本21开始的库支持-v7-appcompat支持设备pre-lollipop。Blogpost about support appcompat v21 from Chris Banes

enter image description here

Read more about the Material Theme on the official Android Developers website

答案 1 :(得分:306)

更新

棒棒糖:

public abstract void setStatusBarColor (int color)

在API级别21中添加

Android Lollipop带来了改变应用状态栏颜色的功能,可提供更加身临其境的用户体验,并与Google Material Design Guidelines保持一致。

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

更改状态栏的颜色还需要在窗口上设置两个额外的标志;您需要添加FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS标志并清除FLAG_TRANSLUCENT_STATUS标志。

工作代码:

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)

示例:material-design-everywhere

Chris Banes Blog- appcompat v21: material design for pre-Lollipop devices!

enter image description here

视图背景的transitionNameandroid:status:background

答案 2 :(得分:183)

这是你的值-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>

答案 3 :(得分:47)

这是一个非常简单的方法,没有任何库: 如果不支持操作系统版本 - 在kitkat下 - 所以没有任何事情发生。 我这样做了:

  1. 在我的xml中我添加到顶部此视图:
  2. <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);
         }
    }
    

    你也需要这两种方法才能获得行动Bar&amp;状态栏高度:

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

答案 4 :(得分:29)

好吧,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 attr:

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>

状态栏高度始终为24dp KitKat及以上版本的dimens-v19.xml:

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

dimens-v21.xml for Lolipop,只需根据需要添加高程:

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

这是Jellybean KitKat和Lollipop的结果:

enter image description here

答案 5 :(得分:21)

正如@Niels所说,你必须放在values-v21 / styles.xml:

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

但如果您想要单个styles.xml,请添加tools:targetApi="lollipop",例如:

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

答案 6 :(得分:18)

只需在 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>

答案 7 :(得分:12)

我有这个要求:以编程方式更改状态栏颜色,使其保持透明,以允许导航抽屉绘制自己与trasparent状态栏重叠。

我无法使用API​​

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

如果您在此处检查堆栈溢出,那么在该行代码之前将状态栏的透明度设置为实心

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

我可以管理状态栏的颜色和透明度,如下所示:

  • Android 4:你无能为力,因为你无法通过API管理状态栏颜色......你唯一能做的就是将状态栏设置为半透明并移动彩色元素您在状态栏下的UI。要做到这一点,你需要玩

    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">
    

答案 8 :(得分:12)

您可以使用此功能更改状态栏颜色。在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));
    }
}

答案 9 :(得分:10)

如果要通过编程方式更改状态栏颜色(并且前提是该设备具有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
}

答案 10 :(得分:9)

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

科特林的一线客:

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

答案 11 :(得分:5)

如果您想使用Android 4.4及更高版本,请尝试使用此功能。我指的是Harpreet的回答和这个链接。 Android and the transparent status bar

首先,在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;
}

在: before

在: after

状态栏的颜色已更改,但导航栏已被切断,因此我们需要在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);
    }

然后状态栏将如下所示。

status bar

答案 12 :(得分:5)

在“值”的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>

答案 13 :(得分: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));
        }
    }

答案 14 :(得分:4)

只需在你的styles.xml 文件中添加这些行

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- This is used for statusbar color. -->
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <!-- This is used for statusbar content color. If statusbarColor is light, use "true" otherwise use "false"-->
    <item name="android:windowLightStatusBar">false</item>
</style>

答案 15 :(得分:4)

解决方案非常简单,将以下几行放入您的style.xml

对于黑暗模式:

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

答案 16 :(得分: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);

答案 17 :(得分:1)

要更改状态栏的颜色,请转到 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>

答案 18 :(得分:0)

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <!-- Primary brand color. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorPrimaryVariant">@color/colorPrimaryDark</item>
    <item name="colorOnPrimary">@color/white</item>
    <!-- Secondary brand color. -->
    <item name="colorOnSecondary">@color/black</item>
    <!-- Status bar color. -->
    <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
    <!-- Customize your theme here. -->
</style>

Notice:colorPrimaryVariant

答案 19 :(得分:0)

如果要设置自定义可绘制文件,请使用此代码段

fun setCustomStatusBar(){
    if (Build.VERSION.SDK_INT >= 21) {
        val decor = window.decorView
        decor.viewTreeObserver.addOnPreDrawListener(object :
            ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                decor.viewTreeObserver.removeOnPreDrawListener(this)
                val statusBar = decor.findViewById<View> 
                  (android.R.id.statusBarBackground)
                statusBar.setBackgroundResource(R.drawable.bg_statusbar)
                return true
            }
        })
    }
}

答案 20 :(得分:0)

我使用此代码将状态栏更改为透明

    activity?.window?.setFlags(
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
    )

使用此代码将其更改为颜色样式 我在onDetach()的片段中使用了

activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)

答案 21 :(得分:0)

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

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

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

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

答案 22 :(得分:0)

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>