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

Change status bar text color when primaryDark is white

我正在尝试重现 Google 日历应用程序的行为:

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

有什么办法可以改变状态栏文字的颜色吗?

我不确定您的 API 级别是什么,但是如果您可以使用 API 23 个特定的东西,您可以将以下内容添加到您的 AppTheme styles.xml:

<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightStatusBar">true</item>

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>

您可以像这样以编程方式执行此操作 answer

只需添加此

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

和以前一样,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);
}

试试这个。

在您的 activity 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 - 是状态栏颜色。

很简单:

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
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

对我有用

在您的 activity onCreate() 方法中,将以下代码粘贴到 setContentView(R.layout.activity_generic_main);

之后

下面是示例代码。

public class GenericMain extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_generic_main);
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

    }
}

如果不是初始页面,试试这个

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

根据@Jon 的回答,我会稍微更新一下,但会更新 apis。在带有主题和夜间主题(暗模式)的新 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 就不用怕深色主题了 ;)

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

对于将来希望在片段中以编程方式将状态栏颜色从白色更改为主要深色的任何人,当使用 [=14] 将片段最小 api 21< 23 in android =]

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

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

科特林:

// deprecated
// WindowInsetsControllerCompat(<window>, <view>).isAppearanceLightStatusBars = Boolean
ViewCompat.getWindowInsetsController(<view>)?.isAppearanceLightStatusBars = Boolean

Java:

// deprecated
// new WindowInsetsControllerCompat(<window>, <view>).setAppearanceLightStatusBars(boolean)
ViewCompat.getWindowInsetsController(<view>).setAppearanceLightStatusBars(boolean)

您可以直接从您的 activity 获取 window,并使用 view

的任何视图

例如:

Window window = Activity.getWindow();
View view = window.getDecorView();

为此

你需要androidx.core

所以在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.

要获得白色状态栏和黑色文本颜色,请执行此操作 (Kotlin):

在您的 activity 主函数的 onCreate 函数中添加这个

val window: Window = window
WindowInsetsControllerCompat(window,window.decorView).isAppearanceLightStatusBars = true

resoursces/styles.xml中添加这个

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:statusBarColor">#ffffff</item> <!-- this line sets the status bar color (in my case #ffffff is white) -->
<!-- the following lines are not required -->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimary</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

这也适用于 API 级别 21。