使用 AppCompat ActionBarActivity 更改状态栏颜色

在我的一个活动中,我使用 Palette更改了工具栏的颜色。但在5.0设备上使用 ActionBarActivitystatus bar颜色是我的 colorPrimaryDark颜色在我的活动主题,所以我有2个非常不同的颜色,它看起来不好。

我知道在5.0中你可以使用 Window.setStatusBarColor(),但是 ActionBarActivity没有这个。

所以我的问题是在5.0中如何用 ActionBarActivity改变状态栏的颜色?

170456 次浏览

我认为状态栏颜色还没有在 AppCompat 中实现:

    <!-- ============= -->
<!-- Color palette -->
<!-- ============= -->


<!-- The primary branding color for the app. By default, this is the color applied to the
action bar background. -->
<attr name="colorPrimary" format="color" />


<!-- Dark variant of the primary branding color. By default, this is the color applied to
the status bar (via statusBarColor) and navigation bar (via navigationBarColor). -->
<attr name="colorPrimaryDark" format="color" />


<!-- Bright complement to the primary branding color. By default, this is the color applied
to framework controls (via colorControlActivated). -->
<attr name="colorAccent" format="color" />


<!-- The color applied to framework controls in their normal state. -->
<attr name="colorControlNormal" format="color" />


<!-- The color applied to framework controls in their activated (ex. checked) state. -->
<attr name="colorControlActivated" format="color" />


<!-- The color applied to framework control highlights (ex. ripples, list selectors). -->
<attr name="colorControlHighlight" format="color" />


<!-- The color applied to framework buttons in their normal state. -->
<attr name="colorButtonNormal" format="color" />


<!-- The color applied to framework switch thumbs in their normal state. -->
<attr name="colorSwitchThumbNormal" format="color" />

(来自 Sdk 附加 android 支持 v7 appcompat res value attrs.xml)

我不确定我是否理解这个问题。

我你想改变状态栏的颜色编程(并提供的设备有 Android 5.0) ,然后你 可以使用 Window.setStatusBarColor()。活性来源于 Activity还是 ActionBarActivity应该没有差别。

试着这样做:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.BLUE);
}

刚刚用 ActionBarActivity测试了一下,效果还不错。


注意: 如果您的 values-v21样式文件已经设置了 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS标志,则不需要通过编程方式设置 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS标志,方法是:

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

有多种方法可以改变状态栏的颜色。

1)使用 styles.xml。您可以使用 android: statusBarColor 属性以简单但静态的方式完成这项工作。

注意: 您也可以将此属性用于“材质”主题。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="AppTheme.Base">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>

2)可以使用 Window 类中的 setStatusBarColor (int)方法动态完成。但是请记住,此方法只适用于 API 21或更高版本。所以一定要检查一下,否则你的应用程序肯定会在低端设备上崩溃。

下面是此方法的一个工作示例。

if (Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(getResources().getColor(R.color.primaryDark));
}

其中 primaryDark 是我在应用程序中使用的原色的700色调。您可以在 Colors.xml 文件中定义这种颜色。

一定要试一试,如果你有什么问题就告诉我,希望对你有帮助。

试试这个, 我使用这个,它与 v21非常好的工作。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="colorPrimaryDark">@color/blue</item>
</style>

在 xamarin.android MVVMCross 应用程序的一定研发之后,在以下工作的帮助下,感谢以上的回答

为 OnCreate 方法中的活动指定的标志

protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
this.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
}

对于每个 MvxActivity,主题如下所示

 [Activity(
LaunchMode = LaunchMode.SingleTop,
ScreenOrientation = ScreenOrientation.Portrait,
Theme = "@style/Theme.Splash",
Name = "MyView"
)]

我的 SplashStyle.xml 如下所示

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@color/app_red</item>
<item name="android:colorPrimaryDark">@color/app_red</item>
</style>
</resources>

我有 V7产品。

申请

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

Theme.AppCompat.Light.DarkActionBar没有为我工作。诀窍在于,在 styles.xml 中像往常一样给出 colorPrimaryDarkandroid:colorPrimary

<item name="android:colorAccent">@color/color_primary</item>
<item name="android:colorPrimary">@color/color_primary</item>
<item name="android:colorPrimaryDark">@color/color_primary_dark</item>

和在设置

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
{
Window window = this.Window;
Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
}

不需要在代码中设置状态栏颜色。

[ Kotlin 版本]我创建了这个扩展,它还检查所需的颜色是否有足够的对比度来隐藏系统界面,比如电池状态图标、时钟等等,所以我们根据这个设置系统界面是白色还是黑色。

fun Activity.coloredStatusBarMode(@ColorInt color: Int = Color.WHITE, lightSystemUI: Boolean? = null) {
var flags: Int = window.decorView.systemUiVisibility // get current flags
var systemLightUIFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
var setSystemUILight = lightSystemUI


if (setSystemUILight == null) {
// Automatically check if the desired status bar is dark or light
setSystemUILight = ColorUtils.calculateLuminance(color) < 0.5
}


flags = if (setSystemUILight) {
// Set System UI Light (Battery Status Icon, Clock, etc)
removeFlag(flags, systemLightUIFlag)
} else {
// Set System UI Dark (Battery Status Icon, Clock, etc)
addFlag(flags, systemLightUIFlag)
}


window.decorView.systemUiVisibility = flags
window.statusBarColor = color
}


private fun containsFlag(flags: Int, flagToCheck: Int) = (flags and flagToCheck) != 0


private fun addFlag(flags: Int, flagToAdd: Int): Int {
return if (!containsFlag(flags, flagToAdd)) {
flags or flagToAdd
} else {
flags
}
}


private fun removeFlag(flags: Int, flagToRemove: Int): Int {
return if (containsFlag(flags, flagToRemove)) {
flags and flagToRemove.inv()
} else {
flags
}
}

如果你在 Android 系统中使用 Kotllin,这个功能就可以实现:

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.statusBarColor = Color.WHITE

ActivityFragmentOnCreate()中加入这个 kotlin代码:

  if (Build.VERSION.SDK_INT >= 21) {
val window: Window = requireActivity().window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.statusBarColor = resources.getColor(R.color.very_light_pink)
}

只要将这个函数粘贴到 Utils 类中,就可以保存所有其他常用函数。

fun Activity.changeStatusBarColor(color: Int, isLight: Boolean) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = color


WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightStatusBars = isLight
}
 

像这样在任何地方使用它:

changeStatusBarColor(
ContextCompat.getColor(
context,
R.color.black
), false
)

注意,这里我还分别管理了状态栏的深色和浅色,以管理出状态栏的图标和文本颜色。