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

首先它不像在如何更改Android状态栏的背景颜色重复

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

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

在这里输入图像描述

Android 5.0 Lollipop引入了Material Design主题,该主题根据主题的ColorPrimaryDark值自动为状态栏添加颜色。

这在设备的前棒棒糖上得到了支持,这要归功于从版本21开始的库支持-v7-appcompat。 关于从Chris Banes支持appcompat v21的博文

在这里输入图像描述

在官方Android Developers网站上了解更多关于Material Theme的信息

更新:

棒糖:

 public abstract void setStatusBarColor (int color) 

在API级别21中添加

Android Lollipop带来了改变应用中状态栏颜色的能力,让用户体验更加身临其境,并且符合Google的Material Design Guidelines

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

改变状态栏的颜色也需要在窗口上设置两个额外的标志; 您需要添加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)); 

offcial: http : //developer.android.com/reference/android/view/Window.html#setStatusBarColor( int )

例如: 材料devise – 无处不在

https://chris.banes.me/2014/10/17/appcompat-v21/

在这里输入图像描述

视图背景的transitionName将是“ android:status:background ”。

放置这是你的值-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">@color/color_primary</item> </style> </resources> 

这是非常简单的方法来做到这一点,没有任何图书馆:如果操作系统版本不支持 – 在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)); 

那么,Izhar解决scheme是好的,但是,我个人试图避免代码看起来像这样:

  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解决scheme,并使用XML获得相同的结果:为StatusBar的status_bar.xml创build一个布局

 <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添加值,并且为小于KitKat添加statusBarHeight:dimens.xml的高度:

 <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和棒棒糖的结果:

在这里输入图像描述

这是在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)); } } 

另一个解决scheme:

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

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

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

并将AndroidManifest.xml中的活动主题修改为您想要的活动主题,在下一个活动中,您可以通过select原始主题将颜色更改回原始主题:

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

如果你想在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); } 

那么状态栏将如下所示。

状态栏

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

我不能这样做使用API

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

如果你在这里检查堆栈溢出,那么在这行代码之前,设置状态栏的透明度要稳定

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

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

  • Android 4:你可以做的事情不多,因为你不能pipe理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">