我正在努力让一些元数据在Android上运行。最具体地说,我正在获取应用程序级元数据,以下列格式设置View的背景:
<meta-data android:name="background"
android:value="red" />
<meta-data android:name="background"
android:resource="@drawable/my_red_background" />
<meta-data android:name="background"
android:value="#FF0000" />
我使用以下代码来解析信息:
ApplicationInfo app = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
Bundle metaData = app.metaData;
if (metaData != null) {
int resourceID = metaData.getInt("background", -1);
if (resourceID != -1) {
//set the background resource of my view (THIS WORKS)
}
else {
String background = metaData.getString("background");
if (background != null) {
try {
backgroundColor = Color.parseColor(background);
//Set background color (THIS WORKS for 'red', 'blue', etc.)
}
catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
如果我使用资源方法并将其指向drawable,则可行。如果我使用“红色”,“蓝色”,“黄色”等颜色字符串 - 这些也可以。但是,如果我尝试使用任何格式前面带有哈希标记(#FF0000,#FFFF0000等)的颜色,这不起作用,即使Android Documentation表明它应该:
这是一个已知的错误吗?有一个简单的解决方法(除了使用简单的字符串或可绘制的引用)?或者我错过了什么?我正在使用华硕Transformer Prime 10.1 TF301平板电脑进行测试(Android 4.0.3)。
修改
我想注意这不是Color.parseColor()
的问题。 Android永远不会输入语句if (background != null)
,所以元数据根本不会被识别为字符串。
答案 0 :(得分:3)
解决!这不是Android错误,而是Android文档错误(惊喜,惊喜!)。十六进制颜色需要一个转义字符才能正确处理:
<meta-data android:name="background"
android:value="\#FF0000" />
答案 1 :(得分:2)
解决方案1)使用反斜杠,以便值是字符串而不是数字。
解决方案2)而不是调用Color.parseColor(bundle.parseString(..))
,只需使用没有反斜杠的getInt(..)。
<强>背景强>
android:value="#aabbgg"
是一个数字
android:value="\#aabbgg"
是一个字符串