cod*_*cat 371 android statusbar android-notifications android-navigation
首先,它不是重复,如在如何更改Android状态栏的背景颜色
如何更改状态栏颜色,该颜色应与导航栏中的颜色相同.
我希望状态栏颜色与导航栏颜色相同

Gio*_*gio 570
Android 5.0 Lollipop推出了Material Design主题,它根据colorPrimaryDark主题的值自动为状态栏添加颜色.
由于来自版本21的库支持-v7-appcompat支持设备pre-lollipop.来自Chris Banes的支持appcompat v21的博客帖子

在官方Android开发者网站上阅读有关Material Theme的更多信息
cod*_*cat 334
更新:
棒糖:
public abstract void setStatusBarColor (int color)
Run Code Online (Sandbox Code Playgroud)
在API级别21中添加
Android Lollipop带来了改变应用中状态栏颜色的能力,可以提供更加身临其境的用户体验,并与Google相媲美Material Design Guidelines.
以下是使用window.setStatusBarColor引入的新方法更改状态栏颜色的方法API level 21.
更改状态栏的颜色还需要在窗口上设置两个额外的标志; 你需要添加FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS标志并清除FLAG_TRANSLUCENT_STATUS标志.
工作守则:
import android.view.Window;
Run Code Online (Sandbox Code Playgroud)
官方开发人员参考:setStatusBarColor(int)
示例:材料设计 - 无处不在
Chris Banes Blog- appcompat v21:前Lollipop设备的材料设计!

在transitionName该视图背景会android:status:background.
Nie*_*els 202
这是你的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>
Run Code Online (Sandbox Code Playgroud)
itz*_*har 48
没有任何库,这是非常简单的方法:如果不支持操作系统版本 - 在kitkat下 - 所以没有任何事情发生.我这样做了:
Run Code Online (Sandbox Code Playgroud)<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);
}
}
Run Code Online (Sandbox Code Playgroud)
你需要这两种方法来获取动作栏和状态栏高度:
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;
}
Run Code Online (Sandbox Code Playgroud)
那么你唯一需要的是设置状态栏颜色的这一行:
setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));
Run Code Online (Sandbox Code Playgroud)
Mot*_*tov 29
好吧,Izhar解决方案还可以,但是,就我个人而言,我试图避免代码看起来像这样:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do what you need for this SDK
};
Run Code Online (Sandbox Code Playgroud)
同样,我也不喜欢重复代码.在你的回答中,我必须在所有活动中添加这样的代码行:
setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));
Run Code Online (Sandbox Code Playgroud)
因此,我使用了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">
Run Code Online (Sandbox Code Playgroud)
注意高度和高程属性,这些属性将设置为值,值-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>
Run Code Online (Sandbox Code Playgroud)
对于工具栏,添加上边距属性:
<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">
Run Code Online (Sandbox Code Playgroud)
在appTheme style-v19.xml和styles-v21.xml中,添加windowTranslucent attr:
styles-v19.xml,v21:
<resources>
<item name="android:windowTranslucentStatus">true</item>
</resources>
Run Code Online (Sandbox Code Playgroud)
最后,在您的维度上,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>
Run Code Online (Sandbox Code Playgroud)
KitKat及以上版本的状态栏高度始终为24dp dimens-v19.xml:
<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>
Run Code Online (Sandbox Code Playgroud)
维持Lolipop的dimens-v21.xml,如果需要,只需添加标高:
<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>
Run Code Online (Sandbox Code Playgroud)
这是Jellybean KitKat和Lollipop的结果:

Fai*_*ikh 28
正如@Niels所说,你必须放在values-v21/styles.xml中:
<item name="android:statusBarColor">@color/black</item>
Run Code Online (Sandbox Code Playgroud)
但是tools:targetApi="lollipop"如果你想要单个styles.xml,请添加,例如:
<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>
Run Code Online (Sandbox Code Playgroud)
小智 23
只需在res/values/styles.xml中创建一个新主题,您可以在其中更改状态栏颜色"colorPrimaryDark":
<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimaryDark">@color/colorGray</item>
</style>
Run Code Online (Sandbox Code Playgroud)
并将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>
Run Code Online (Sandbox Code Playgroud)
这是你的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>
Run Code Online (Sandbox Code Playgroud)
ste*_*etz 21
您可以使用以下简单代码:
科特林的一线客:
window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)
Run Code Online (Sandbox Code Playgroud)
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));
}
Run Code Online (Sandbox Code Playgroud)
rad*_*wer 15
要更改状态栏的颜色,请转到
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>
Run Code Online (Sandbox Code Playgroud)
saj*_*asi 14
您可以使用此功能更改状态栏颜色.在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));
}
}
Run Code Online (Sandbox Code Playgroud)
DSo*_*ldo 13
我有这个要求:以编程方式更改状态栏颜色,使其保持透明,以允许导航抽屉绘制自己与trasparent状态栏重叠.
我不能使用API来做到这一点
getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)
Run Code Online (Sandbox Code Playgroud)
如果你在这里检查堆栈溢出,那么在该行代码之前将状态栏的透明度设置为solid
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
Run Code Online (Sandbox Code Playgroud)
我能够管理状态栏的颜色和透明度,如下所示:
Android 4:你无能为力,因为你无法通过API管理状态栏颜色......你唯一能做的就是将状态栏设置为半透明状态,并在状态下移动你的UI的彩色元素酒吧.要做到这一点,你需要玩
android:fitsSystemWindows="false"
Run Code Online (Sandbox Code Playgroud)
在你的主要布局中.这允许您在状态栏下绘制布局.然后你需要在主布局的顶部玩一些填充.
Android 5及以上版本:你必须定义一个样式
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
Run Code Online (Sandbox Code Playgroud)
这允许导航抽屉与状态栏重叠.
然后要更改保持状态栏透明的颜色,您必须使用设置状态栏颜色
drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))
Run Code Online (Sandbox Code Playgroud)
其中drawerLayout的定义如下
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
Run Code Online (Sandbox Code Playgroud)Nab*_*bin 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
}
Run Code Online (Sandbox Code Playgroud)
将“值”中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>
Run Code Online (Sandbox Code Playgroud)
解决方法很简单,把下面几行放到你的style.xml中
对于深色模式:
<item name="android:windowLightStatusBar">false</item>
<item name="android:statusBarColor">@color/black</item>
Run Code Online (Sandbox Code Playgroud)
如果您想使用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;
}
Run Code Online (Sandbox Code Playgroud)
状态栏的颜色已更改,但导航栏已被切断,因此我们需要在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);
}
Run Code Online (Sandbox Code Playgroud)
然后状态栏将如下所示.
要更改lolipop的颜色,只需将其添加到您的styles.xml中
<item name="android:statusBarColor">@color/statusBarColor</item>
Run Code Online (Sandbox Code Playgroud)
但请记住,如果您希望状态栏的颜色为浅色,也请添加此行
<item name="android:windowLightStatusBar">true</item>
Run Code Online (Sandbox Code Playgroud)
只需在你的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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
701241 次 |
| 最近记录: |