在我的一项活动中,我使用更改了工具栏的颜色Palette
。但在使用5.0的设备ActionBarActivity
的status bar
颜色的颜色我colorPrimaryDark
我的活动主题,所以我有2种非常不同的颜色和它看起来并不好。
我意识到在5.0中您可以使用,Window.setStatusBarColor()
但ActionBarActivity
没有此功能。
所以我的问题是在5.0中如何更改状态栏的颜色ActionBarActivity
?
在我的一项活动中,我使用更改了工具栏的颜色Palette
。但在使用5.0的设备ActionBarActivity
的status bar
颜色的颜色我colorPrimaryDark
我的活动主题,所以我有2种非常不同的颜色和它看起来并不好。
我意识到在5.0中您可以使用,Window.setStatusBarColor()
但ActionBarActivity
没有此功能。
所以我的问题是在5.0中如何更改状态栏的颜色ActionBarActivity
?
Answers:
我不确定我是否理解问题。
我想通过编程方式更改状态栏的颜色(并且前提是该设备具有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
,就可以了。
注意:FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
如果您的values-v21
样式文件已经设置了标志,则无需通过编程方式设置标志,方法是:
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
getWindow()
minSdkVersion
targetSdkVersion
<uses-sdk ...>
有多种更改状态栏颜色的方法。
1)使用styles.xml。您可以使用android:statusBarColor属性以简单但静态的方式执行此操作。
注意:您也可以将此属性与Material主题一起使用。
<?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文件中定义此颜色。
请尝试一下,如果您有任何疑问,请告诉我。希望能帮助到你。
clearFlags
解决我的问题
我认为状态栏颜色尚未在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 \ extras \ android \ support \ v7 \ appcompat \ res \ values \ attrs.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 appcompact。
[Kotlin版本]我创建了此扩展程序,该扩展程序还检查所需的颜色是否具有足够的对比度以隐藏系统UI,例如电池状态图标,时钟等,因此我们据此将系统UI设置为白色或黑色。
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
}
}
正在申请
<item name="android:statusBarColor">@color/color_primary_dark</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
在Theme.AppCompat.Light.DarkActionBar
没有为我工作。诀窍是什么,colorPrimaryDark
像往常一样 android:colorPrimary
在styles.xml中给出
<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);
}
不必在代码中设置状态栏颜色。