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 就不用怕深色主题了 ;)

然而,这样做的缺点是我们正在添加另一个我们需要记住要管理的文件。