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

时间:2016-07-14 19:04:15

标签: android android-styles android-statusbar

我正在尝试重现Google日历应用的行为: enter image description here

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

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

提前致谢

12 个答案:

答案 0 :(得分:63)

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

android:windowLightStatusBar

android:windowLightStatusBar设置为true时,状态栏颜色为白色时可以看到状态栏文本颜色,反之亦然 当<!-- 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> 设置为false时,状态栏文本颜色将设计为在状态栏颜色较暗时显示。

示例:

{{1}}

答案 1 :(得分:6)

您可以像这样answer

那样以编程方式进行操作

只需添加

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

答案 2 :(得分:4)

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

科特林:

par(mfrow=c(1,1))
Oz <- airquality$Ozone
locf <- function(x) {
  a <- x[1]
  for (i in 2:length(x)) {
    if (is.na(x[i])) x[i] <- a
    else a <- x[i]
  }
  return(x)
}
Ozi <- locf(Oz)
colvec <- ifelse(is.na(Oz),mdc(2),mdc(1))

### Figure

plot(Ozi[1:80],col=colvec,type="l",xlab="Day number",ylab="Ozone (ppb)")
points(Ozi[1:80],col=colvec,pch=20,cex=1)

Java:

   import { StackActions } from '@react-navigation/native';
   ...
   navigation.dispatch(StackActions.push("Mdp", { phone: '0600000000', }))

您可以直接从您的 Activity 中获取 WindowInsetsControllerCompat(<window>, <view>).isAppearanceLightStatusBars = Boolean ,并针对 new WindowInsetsControllerCompat(<window>, <view>).setAppearanceLightStatusBars(boolean) 使用任何视图

例如:

window

您需要 view 才能做到这一点

答案 3 :(得分:1)

这很简单:

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

,反之亦然:

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

答案 4 :(得分:1)

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//  set status text dark

getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this,R.color.colorPrimaryDark));// set status background white

对我有用

答案 5 :(得分:1)

在活动npm run test方法中,将以下代码粘贴到ng test --browser chromHeadless

之后

这是下面的示例代码。

onCreate()

答案 6 :(得分:1)

按照@Jon 的回答,我会稍微更新一下,但会使用新的 api。在带有主题和夜间主题(黑暗模式)的新 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 上的黑暗主题;)

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

答案 7 :(得分:0)

如前所述,在我的情况下,SYSTEM_UI_FLAG_LIGHT_STATUS_BAR可以完成工作,请不要忘记将其设置为高于API 22。

在setContentView之后将其添加到oncreate中:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}

答案 8 :(得分:0)

尝试一次。

在活动onCreate()方法中,粘贴以下代码。

try {
        if (android.os.Build.VERSION.SDK_INT >= 21) {
                Window window = getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_red));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

注意:color_red-是状态栏的颜色。

答案 9 :(得分:0)

如果不启动页面,请尝试此

getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getActivity().getWindow().setNavigationBarColor(ContextCompat.getColor(context, R.color.white));
getActivity().getWindow().setStatusBarColor(ContextCompat.getColor(context, R.color.white));

答案 10 :(得分:0)

对于将来希望在片段中以编程方式将状态栏颜色从白色更改为原始颜色的任何人,在使用 Java 的 android 中为最小 api 21< 23 保留片段时

private void updateStatusBar(boolean isEnter){

    Window window = requireActivity().getWindow();

    int color = ContextCompat.getColor(requireActivity(),R.color.colorAlertDialog);

    if(isEnter) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        else
            clearDecorFlags(window);
    }
    else {
        color = ContextCompat.getColor(requireActivity(),R.color.colorPrimaryDark);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            window.getDecorView().setSystemUiVisibility(window.getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        else
            clearDecorFlags(window);
    }
    window.setStatusBarColor(color);
}

private void clearDecorFlags(Window window){
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
}

答案 11 :(得分:0)

所以在 kotlin 的情况下有点不同

//for Dark status bar icon with white background

    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
            getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.white))    
    
             
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv())
            getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.black))

 // for dark background and light theme colours of icon.