Android Lollipop设置状态栏文本颜色

时间:2015-05-26 16:36:23

标签: android android-5.0-lollipop

我尝试在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));

8 个答案:

答案 0 :(得分:59)

您无法通过明确指定任何颜色来设置状态栏文本颜色

但您可以尝试下面的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>

您可以在以下链接中查看上面的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);

enter image description here

默认情况下为黑色,因此将其保留为浅色背景。

答案 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));
}