当primaryDark为白色时更改状态栏文本颜色

Mar*_*orn 50 android android-styles android-statusbar

我正在尝试重现Google日历应用程序的行为: 在此输入图像描述

但我还没有找到改变状态文本颜色的方法.如果我将colorPrimaryDark设置为白色,我无法看到图标既不是状态栏的文本也不是因为它们的颜色也是白色.

有没有办法改变状态栏文字颜色?

提前致谢

小智 102

我不确定您尝试定位的API级别,但如果您可以使用API​​ 23特定内容,则可以将以下内容添加到AppTheme styles.xml中:

<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightStatusBar">true</item>
Run Code Online (Sandbox Code Playgroud)

android:windowLightStatusBar设置为true时,状态栏文本颜色将在状态栏颜色为白色时显示,反之亦然当android:windowLightStatusBar设置为false时,状态栏文本颜色将设计为在状态栏颜色为暗.

例:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <!-- Status bar stuff. -->
    <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    <item name="android:windowLightStatusBar">true</item> 
</style>
Run Code Online (Sandbox Code Playgroud)

  • 如果我的api等级是21,那么它无法正常工作你能告诉我替代方案 (29认同)
  • 注意:android:windowLightStatusBar 需要 API 级别 23(当前最小值为 21)更多...(⌘F1) (4认同)
  • 为Api 21找到任何解决方案。请帮忙? (3认同)
  • 请参阅这篇文章了解 API 级别 &lt; 23:/sf/ask/3447841421/#49255140 (2认同)

M.G*_*M.G 19

你可以像这样的答案以编程方式做到这一点

加上这个

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
Run Code Online (Sandbox Code Playgroud)

  • setSystemUiVisibility 已弃用 (6认同)

小智 19

这很简单:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//  set status text dark
getWindow().setStatusBarColor(ContextCompat.getColor(BookReaderActivity.this,R.color.white));// set status background white
Run Code Online (Sandbox Code Playgroud)

反之亦然:

getWindow().setStatusBarColor(ContextCompat.getColor(BookReaderActivity.this, R.color.black));
View decorView = getWindow().getDecorView(); //set status background black 
decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); //set status text  light
Run Code Online (Sandbox Code Playgroud)


M. *_*cik 17

根据 @Jon 的回答,我会在新的 api 上对其进行一些更新。在具有主题和夜间主题(深色模式)的新 api 上,我将通过添加 v23/styles.xml 并在那里设置状态栏背景和文本颜色来实现:

<item name="android:statusBarColor">@color/lightColor</item>
<item name="android:windowLightStatusBar">true</item>
Run Code Online (Sandbox Code Playgroud)

在 night/styles.xml 中:

<item name="android:statusBarColor" tools:targetApi="l">@color/darkColor</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
Run Code Online (Sandbox Code Playgroud)

默认的 styles.xml 不会包含任何此代码,或者只是此代码,但请记住不要将其设置为亮:

<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我们可以为状态栏设置浅色背景(和文本颜色),但仅适用于 api 23+ 的设备。在 <23 的设备上,背景不会改变,因为我认为这是我们不希望知道文本颜色将保持白色的事情。API 29 上添加了深色主题,因此我们不必害怕 api 21 上的深色主题;)

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


Ace*_*Ace 7

人们仍然没有得到 API 级别 21+(甚至更低)的正确答案。
这里是:

科特林:

WindowInsetsControllerCompat(<window>, <view>).isAppearanceLightStatusBars = Boolean
Run Code Online (Sandbox Code Playgroud)

爪哇:

new WindowInsetsControllerCompat(<window>, <view>).setAppearanceLightStatusBars(boolean)
Run Code Online (Sandbox Code Playgroud)

您可以window直接从您的活动中获取,并使用任何视图view

例如:

Window window = Activity.getWindow();
View view = window.getDecorView();
Run Code Online (Sandbox Code Playgroud)

你需要androidx.core这个