如何在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下 – 没有任何发生。 我做这个步骤:
- 在我的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">