Android棒棒糖设置状态栏文字颜色
Android Lollipop Set Status Bar Text Color
我试图在 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));
对于Android 6.0及以上你可以查看.
Android 5.0
我们只能更改状态栏颜色,不能更改状态栏文本颜色。
没有像
这样的方法
setStatusBarTextColor(getResources().getColor(R.color.orange));
简而言之,在 Android 5.0 上是不可能的。检查这个 answer
您不能通过显式指定任何颜色来设置状态栏文本颜色
但是你可以尝试下面的替代方案,它是在 API 23,
中添加的
您可以通过两种方式使用 "android:windowLightStatusBar" 属性
- "android:windowLightStatusBar" = true, 状态栏文字颜色为
当状态栏颜色为浅色时兼容(灰色)
- "android:windowLightStatusBar" = false,状态栏文字颜色为
当状态栏颜色为深色时兼容(白色)
<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>
您可以在下方 link - https://developer.android.com/reference/android/R.attr.html#windowLightStatusBar
中查看上方 api
您也可以在运行时执行此操作。这是 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
}
这是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));
}
当您使用白色作为状态栏时,您可以使用此行设置较深的文本颜色。
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
对于 ANDROID 6.0+
您可以使用它来将状态栏内容颜色更改为在黑色背景上亮起,如下图所示。
View decorView = this.getWindow().getDecorView();
int systemUiVisibilityFlags = decorView.getSystemUiVisibility();
systemUiVisibilityFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
decorView.setSystemUiVisibility(systemUiVisibilityFlags);
默认情况下,它是黑色的,所以保留它作为浅色背景。
到目前为止我的首选解决方案
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));
}
@Sunita 答案是正确的,但是如果你使用 API 21,如果你这样设置,状态栏颜色会变浅,状态栏文本颜色也会变浅,在 23+ 上它会起作用美好的。在带有主题和夜间主题(暗模式)的新 api 上,我会通过添加 v23/styles.xml 并在那里设置状态栏背景和文本颜色来实现:
<item name="android:statusBarColor">@color/lightColor</item>
<item name="android:windowLightStatusBar">true</item>
并在 night/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 就不用怕深色主题了 ;)
然而,这样做的缺点是我们正在添加另一个我们需要记住要管理的文件。
我试图在 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));
对于Android 6.0及以上你可以查看
Android 5.0
我们只能更改状态栏颜色,不能更改状态栏文本颜色。
没有像
这样的方法setStatusBarTextColor(getResources().getColor(R.color.orange));
简而言之,在 Android 5.0 上是不可能的。检查这个 answer
您不能通过显式指定任何颜色来设置状态栏文本颜色
但是你可以尝试下面的替代方案,它是在 API 23,
中添加的您可以通过两种方式使用 "android:windowLightStatusBar" 属性
- "android:windowLightStatusBar" = true, 状态栏文字颜色为 当状态栏颜色为浅色时兼容(灰色)
- "android:windowLightStatusBar" = false,状态栏文字颜色为 当状态栏颜色为深色时兼容(白色)
<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>
您可以在下方 link - https://developer.android.com/reference/android/R.attr.html#windowLightStatusBar
中查看上方 api您也可以在运行时执行此操作。这是 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
}
这是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));
}
当您使用白色作为状态栏时,您可以使用此行设置较深的文本颜色。
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
对于 ANDROID 6.0+
您可以使用它来将状态栏内容颜色更改为在黑色背景上亮起,如下图所示。
View decorView = this.getWindow().getDecorView();
int systemUiVisibilityFlags = decorView.getSystemUiVisibility();
systemUiVisibilityFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
decorView.setSystemUiVisibility(systemUiVisibilityFlags);
默认情况下,它是黑色的,所以保留它作为浅色背景。
到目前为止我的首选解决方案
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));
}
@Sunita 答案是正确的,但是如果你使用 API 21,如果你这样设置,状态栏颜色会变浅,状态栏文本颜色也会变浅,在 23+ 上它会起作用美好的。在带有主题和夜间主题(暗模式)的新 api 上,我会通过添加 v23/styles.xml 并在那里设置状态栏背景和文本颜色来实现:
<item name="android:statusBarColor">@color/lightColor</item>
<item name="android:windowLightStatusBar">true</item>
并在 night/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 就不用怕深色主题了 ;)
然而,这样做的缺点是我们正在添加另一个我们需要记住要管理的文件。