【问题标题】:Dynamically change status bar color without losing transparency动态更改状态栏颜色而不丢失透明度
【发布时间】:2018-05-06 15:35:23
【问题描述】:

我知道我可以使用colorPrimary 来确定@​​987654327@ 的颜色,并使用colorPrimaryDark 来确定状态栏的颜色。

我正在使用以下主题

<!-- Base application theme. -->
<style name="Theme.Noteplus.Base.Brown" parent="Theme.AppCompat.Light.DarkActionBar">

    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimaryLight</item>
    <item name="colorPrimaryDark">#ff0000</item>

    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>

其中一个有趣的属性是,当我滑出导航菜单时,状态栏会自动变为透明。


在运行时,有时我想更改状态栏的颜色。

setTitle("Recycler bin");
toolbar.setBackgroundColor(Color.BLUE);
getWindow().setStatusBarColor(Color.parseColor("#5694FF"));

如下所示

很遗憾,当我们滑出导航菜单时,调用setStatusBarColor也会丢失状态栏的透明度属性。

我可以知道,如何在运行时更改状态栏颜色,而不会丢失其透明度属性?对于我的情况,在运行时将状态栏更改为蓝色后,当我滑出导航抽屉时,我希望看到状态栏透明度属性被保留。


更新

我试过了

private void setStatusBarColor(int color) {
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(color);
    }
}

导航抽屉滑出时提供透明度属性无济于事。

【问题讨论】:

  • 你试过了吗? ActionBar bar = getActionBar(); bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#004D40")));
  • 我们已经做了getWindow().setStatusBarColor(Color.parseColor("#5694FF"));,正如我的问题所述。
  • 是的,这是 setBackgroundDrawable 不是 setColor
  • 我们的应用中没有ActionBar。我们使用ToolbargetActionbar() 将返回 null。
  • 我很糟糕,我将操作栏与状态栏混淆了,我添加了一个答案,虽然我现在没有要测试的 AndroidStudio,但我认为它会有所帮助

标签: android android-layout android-view drawerlayout windowinsets


【解决方案1】:

您使用的是DrawerLayout。这意味着,您应该使用DrawerLayout#setStatusBarBackground() 重载之一,而不是使用Window#setStatusBarColor(int)

相当于您的代码如下:

ColorDrawable colorDrawable = new ColorDrawable(0xFF5694FF); drawerLayout.setStatusBarBackground(colorDrawable);

我对可以使用 Android Studio 向导创建的模板应用进行了细微更改:

【讨论】:

    【解决方案2】:

    我猜你的透明度问题不在于你使用的方法,而在于颜色本身! 你正在使用这个getWindow().setStatusBarColor(Color.parseColor("#5694FF"));

    尝试使用 RGBA 代替 RGB,使其透明,应该是这样的:

    getWindow().setStatusBarColor(Color.parseColor("#5694FF80"));

    【讨论】:

    • 那无济于事。 i.imgur.com/9lmRAkg.png(我们使用#7f757575)。我们可以在colorPrimaryDark(即#ff0000)中使用不透明的颜色,但保留状态栏透明属性。
    • 告诉我这是否会改变任何东西:Window win = getWindow(); win.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 并在改变颜色后使用它
    • 如果这行得通,(完全删除了状态栏)然后你可以参考这个找到正确的标志,你需要使它透明或者像android一样调用它 TRANSLUCENT:@987654322 @
    【解决方案3】:
    private void changeStatusBarColor(String color){
        if (Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.parseColor(color));
        }
    }
    

    如果您在该行代码之前检查堆栈溢出,则将状态栏的透明度设置为实心

    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 2023-01-13
      • 1970-01-01
      • 2015-10-28
      • 2011-11-29
      • 2018-06-28
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      相关资源
      最近更新 更多