【问题标题】:Android Lollipop Set Status Bar Text ColorAndroid Lollipop 设置状态栏文本颜色
【发布时间】:2015-05-26 16:36:22
【问题描述】:

我正在尝试在 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 5.0 中没有像 setStatusBarTextColor 这样的方法
  • 与论坛网站不同,我们不使用“谢谢”、“任何帮助表示赞赏”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
  • 无法更改 Lollipop 状态栏文本颜色。要么将状态栏背景设置为半透明,这导致 #4000 背景保证足够的易读性,要么手动将其设置为某种颜色(提示:主要深色,关键字 dark),这将保证与白色前景。我们现在可以手动将颜色从黑色或三星使用的任何随机可绘制对象更改,这还不够吗?

标签: android android-5.0-lollipop


【解决方案1】:

您不能通过显式指定任何颜色来设置状态栏文本颜色

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

【讨论】:

  • 太棒了。不知道。像魅力一样工作。
  • 如果其他人只是像我这样的 Android 应用的“维护者”;只需将其放在您的应用程序或视图正在使用的主题部分下的 styles.xml 中:&lt;item name="android:windowLightStatusBar"&gt;true&lt;/item&gt;
【解决方案2】:

这是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));
}

【讨论】:

  • 对我来说很好。
【解决方案3】:

您也可以在运行时执行此操作。这是一个使用标志 SystemUiVisibility 的 Mono.Android 示例。您必须执行一些按位运算来更改标志。您的应用程序必须设置为目标 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
}

【讨论】:

【解决方案4】:

Android 6.0及以上版本可以查看Sunita's answer

Android 5.0

我们只能更改状态栏颜色而不是状态栏文本颜色。

没有类似的方法

setStatusBarTextColor(getResources().getColor(R.color.orange));

简而言之,这在 Android 5.0 上是不可能的。检查这个answer

【讨论】:

  • 可以从 API 23 及更高版本开始,请查看 Sunita 下面的答案
  • 大声笑,我只是复制粘贴了这段代码,甚至没有读到没有像...这样的方法
【解决方案5】:

适用于安卓 6.0+

您可以使用它来将状态栏内容颜色更改为在黑色背景上亮起,如下图所示。

View decorView = this.getWindow().getDecorView();
int systemUiVisibilityFlags = decorView.getSystemUiVisibility();
systemUiVisibilityFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
decorView.setSystemUiVisibility(systemUiVisibilityFlags);

默认情况下,它是黑色的,所以留给浅色背景。

【讨论】:

    【解决方案6】:

    @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 不会包含任何代码,或者只是这个,但请记住不要将其设置为 light:

    <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
    

    通过这种方式,我们为状态栏设置浅色背景(和文本颜色),但仅适用于 api 23+ 的设备。在

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

    【讨论】:

      【解决方案7】:

      当您使用白色作为状态栏时,您可以使用此行设置较深的文本颜色。

      window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
      

      【讨论】:

        【解决方案8】:

        到目前为止我最喜欢的解决方案

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

        【讨论】:

        • SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 需要 API 23 (Android M)
        猜你喜欢
        • 1970-01-01
        • 2015-02-28
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        相关资源
        最近更新 更多