正确使用ContextCompat.getColor()进行基于主题

时间:2016-02-15 17:40:43

标签: android android-layout android-styles

在Android M中,我看到getColor(int id)被ContextCompat.getColor(Context context,int id)替换。

我是Android新主题样式的新手,所以我不确定如何正确使用此功能。目前,我组织颜色的方式是定义类似的颜色:

值/ attr.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="button_bg" format="reference|color"/>
</resources>

然后我像这样引用它们:

值/的themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowAnimationStyle">@null</item>
    </style>
    <style name="MyTheme.White">
        <item name="button_bg">#fff</item>
    </style>
    <style name="MyTheme.Black">
        <item name="button_bg">#000</item>
    </style>
</resources>
这是有效的。 但是,我现在如何在java中获得button_bg? 我尝试了ContextCompat.getColor(context, R.attr.button_bg),但这给了我Resource not found的错误。

我接近这个错误吗?

1 个答案:

答案 0 :(得分:1)

已经看到,这个问题比一年前还要长,所以希望我仍然可以帮助其他人。

您只需在XML中使用属性ID:

<View
   android:layout_height="50dp"
   android:layout_width="50dp"
   android:background="?attr/button_bg">
  ..../>

在您的活动中,您可以在创建中设置主题:

protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.your_theme);//your theme
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    ....
}

其余部分由android自动生成。

要根据主题通过代码访问颜色,您可以使用以下功能:

@ColorInt
public int getColorByAttributeId(Context context, @AttrRes int attrIdForColor){
    TypedValue typedValue = new TypedValue();
    Resources.Theme theme = context.getTheme();
    theme.resolveAttribute(attrIdForColor, typedValue, true);
    return typedValue.data;
}

该方法只是&#34;愚蠢&#34;,这意味着没有检查所请求的属性颜色是真正的颜色资源。