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

Posted

技术标签:

【中文标题】当 primaryDark 为白色时更改状态栏文本颜色【英文标题】:Change status bar text color when primaryDark is white 【发布时间】:2021-06-18 15:01:44 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

我不确定您尝试针对哪个 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>

【讨论】:

如果我的 api 级别是 21,它不起作用,你能告诉我替代方案吗 找到任何适用于 Api 21 的解决方案。请帮忙? 注意:android:windowLightStatusBar 需要 API 级别 23(当前最低为 21)更多... (⌘F1) 对于 api 21,这是不可能的。在谷歌应用程序中,它是一个黑条而不是一个白条。 查看此帖子了解 API 级别 ***.com/questions/49254877/…【参考方案2】:

你可以像answer这样以编程方式做到这一点

添加这个

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

【讨论】:

setSystemUiVisibility 已弃用【参考方案3】:

很简单:

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

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

科特林:

WindowInsetsControllerCompat(<window>, <view>).isAppearanceLightStatusBars = Boolean

Java:

new WindowInsetsControllerCompat(<window>, <view>).setAppearanceLightStatusBars(boolean)

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

例如:

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

为此您需要androidx.core

【讨论】:

王牌 -> 不错!谢谢!【参考方案5】:

按照@Jon 的回答,我会对其进行一些更新,但会使用新的 api。在带有主题和夜间主题(深色模式)的新 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+ 的设备。在

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:
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

对我有用

【讨论】:

这需要 API 级别 23+。【参考方案8】:

试试这个。

在您的活动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】:

在您的活动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);

    

【讨论】:

【参考方案10】:

如果没有启动页面,试试这个

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

【讨论】:

【参考方案11】:

对于将来希望在片段中以编程方式将状态栏颜色从白色更改并在使用 Java 在 android 中为最小 api 21

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

【讨论】:

覆盖文本颜色?【参考方案12】:

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

【讨论】:

以上是关于当 primaryDark 为白色时更改状态栏文本颜色的主要内容,如果未能解决你的问题,请参考以下文章

当背景颜色为白色时,Android 通知图标颜色不会更改

是否可以更改状态栏文本颜色?

如何在iOS 7上更改状态栏背景颜色和文本颜色? Warif Akhand Rishi

iOS Swift TabBar状态栏文字颜色毛刺半白半黑

如何在 iOS 7 上更改状态栏背景颜色和文本颜色?

iOS Phonegap中的白色状态栏?