我尝试在Android v21中设置状态栏文本颜色,但我没有看到它的API方法。这是我到目前为止的背景
MyActivity.java>的onCreate:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(getResources().getColor(R.color.white));
}
显然,白色背景上的白色文字无法正常工作。我正在寻找像
这样的东西window.setStatusBarTextColor(getResources().getColor(R.color.orange));
答案 0 :(得分:59)
您无法通过明确指定任何颜色来设置状态栏文本颜色
但您可以尝试下面的API 23中添加的替代方案
您可以通过两种方式使用“android:windowLightStatusBar”属性
<style name="statusBarStyle" parent="@android:style/Theme.DeviceDefault.Light"> <item name="android:statusBarColor">@color/status_bar_color</item> <item name="android:windowLightStatusBar">false</item> </style>
您可以在以下链接中查看上面的API - https://developer.android.com/reference/android/R.attr.html#windowLightStatusBar
答案 1 :(得分:21)
这是Gandalf458答案的Java实现。
/** Changes the System Bar Theme. */
@RequiresApi(api = Build.VERSION_CODES.M)
public static final void setSystemBarTheme(final Activity pActivity, final boolean pIsDark) {
// Fetch the current flags.
final int lFlags = pActivity.getWindow().getDecorView().getSystemUiVisibility();
// Update the SystemUiVisibility dependening on whether we want a Light or Dark theme.
pActivity.getWindow().getDecorView().setSystemUiVisibility(pIsDark ? (lFlags & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) : (lFlags | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR));
}
答案 2 :(得分:7)
您也可以在运行时执行此操作。以下是Mono.Android使用标志SystemUiVisibility的示例。你必须做一些按位操作来改变标志。您的应用程序必须设置为目标API 23或更高版本才能使用此标志进行编译。
//Android 6.0 introduced the ability to set a light colored text on the status bar
//MyActivity needs to be changed to your activity
if(Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.M)
{
int newUiVisibility = (int)MyActivity.Window.DecorView.SystemUiVisibility;
if(state == StatusBarState.Light)
{
//Dark Text to show up on your light status bar
newUiVisibility |= (int)Android.Views.SystemUiFlags.LightStatusBar;
}
else if(state == StatusBarState.Dark)
{
//Light Text to show up on your dark status bar
newUiVisibility &= ~(int)Android.Views.SystemUiFlags.LightStatusBar;
}
MyActivity.Window.DecorView.SystemUiVisibility = (Android.Views.StatusBarVisibility)newUiVisibility;
}
public enum StatusBarState
{
Light,
Dark
}
答案 3 :(得分:1)
Android 5.0
我们只能更改状态栏颜色而不是状态栏文本颜色。
没有像
这样的方法setStatusBarTextColor(getResources().getColor(R.color.orange));
简而言之,在Android 5.0上无法实现。请检查此answer
答案 4 :(得分:1)
@Sunita 答案是正确的,但如果您使用 API 21,状态栏颜色将是浅色(如果您如此设置)并且状态栏文本颜色也将是浅色,并且在 23+ 上它会正常工作。在带有主题和夜间主题(黑暗模式)的新 api 上,我会通过添加 v23/styles.xml 并在那里设置状态栏背景和文本颜色来实现:
<item name="android:statusBarColor">@color/lightColor</item>
<item name="android:windowLightStatusBar">true</item>
在晚上/styles.xml:
<item name="android:statusBarColor" tools:targetApi="l">@color/darkColor</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
默认的styles.xml 不包含任何此代码,或仅包含此代码,但请记住不要将其设置为浅色:
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
通过这种方式,我们为状态栏设置了浅色背景(和文本颜色),但仅适用于 api 23+ 的设备。在设备上 <23 背景不会改变,因为我认为这是我们不希望知道文本颜色将保持白色的事情。 黑暗主题是在 API 29 上添加的,所以我们不必害怕 api 21 上的黑暗主题;)
然而,这样做的缺点是我们添加了另一个需要记住管理的文件。
答案 5 :(得分:0)
当状态栏使用白色时,可以使用此行设置较深的文本颜色。
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
答案 6 :(得分:0)
对于ANDROID 6.0 +
您可以使用它来更改状态栏内容的颜色,使其在黑色背景上亮起,如下图所示。
View decorView = this.getWindow().getDecorView();
int systemUiVisibilityFlags = decorView.getSystemUiVisibility();
systemUiVisibilityFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
decorView.setSystemUiVisibility(systemUiVisibilityFlags);
默认情况下为黑色,因此将其保留为浅色背景。
答案 7 :(得分:0)
到目前为止,我的首选解决方案
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this, R.color.colorSecondPrimaryColor));
}