Android状态栏背景颜色设置为R.attr.colorPrimary但使用了错误的颜色

时间:2014-11-02 05:26:54

标签: android colors android-actionbar navigation-drawer android-5.0-lollipop

使用新的Lollipop v21 API,我尝试使用setStatusBarBackgroundColor设置半透明状态栏的背景颜色,但使用R.attr.colorPrimary会导致颜色错误(它使用紫色代替浅蓝色我指定为colorPrimary)。

如何正确设置我的主要颜色,以便R.attr.colorPrimary引用我在styles.xml中设置的colorPrimary?

这是有问题的代码:

nav_drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
nav_drawer.setStatusBarBackgroundColor(R.attr.colorPrimary);

这是我styles.xml中的相关部分:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

    <!-- Use Lollipop's animated hamburger-arrow as drawer indicator -->
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>

    <!-- Action Mode's bar overlays the app bar instead of pushing it down-->
    <item name="windowActionModeOverlay">true</item>

    <!-- Status Bar is translucent -->
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">true</item>

    <!-- Colors -->
    <item name="colorPrimary">@color/lightblue</item>

</style>

是的,我实际上是在我的清单中使用这个AppTheme:

 <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

1 个答案:

答案 0 :(得分:3)

setStatusBarBackgroundColor documentation

  

参数

     

颜色用作背景绘图的颜色,以0xAARRGGBB格式绘制状态栏后面。

但是你传递了一个属性id。您需要解码属性才能获得实际颜色:

 TypedValue typedValue = new  TypedValue();
 context.getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true); 
 final  int color = typedValue.data;
 nav_drawer.setStatusBarBackgroundColor(color);