在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
的错误。
我接近这个错误吗?
答案 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;,这意味着没有检查所请求的属性颜色是真正的颜色资源。