代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

动态更改状态栏颜色而不丢失透明度

  •  5
  • Cheok Yan Cheng  · 技术社区  · 8 年前

    我知道我可以用 colorPrimary 要确定 Toolbar 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);
        }
    }
    

    当导航抽屉滑出时,提供透明度属性没有帮助。

    3 回复  |  直到 8 年前
        1
  •  6
  •   azizbekian    8 年前

    您正在使用 DrawerLayout .这意味着 Window#setStatusBarColor(int) 您应该使用 DrawerLayout#setStatusBarBackground() 重载。

    等效代码如下所示:

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

    我对可以使用Android Studio向导创建的模板应用程序进行了一些小的更改:

    enter image description here

        2
  •  0
  •   Yamen Nassif    8 年前

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

    尝试使用RGBA而不是RGB,以使其透明,应如下所示:

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

        3
  •  0
  •   Benjamin RD    8 年前
    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)
    
    推荐文章