2

我正在努力让一些元数据在 Android 上运行。最具体地说,我正在获取应用程序级元数据来设置以下格式的视图背景:

<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();
        }
    }

}

如果我使用资源方法并将其指向可绘制对象,则此方法有效。如果我使用“红色”、“蓝色”、“黄色”等颜色字符串 - 这些也可以。但是,如果我尝试使用前面带有井号(#FF0000、#FFFF0000 等)的任何格式的颜色,这将不起作用,即使Android 文档建议它应该:

android:值描述

这是一个已知的错误?有没有简单的解决方法(除了使用简单的字符串或可绘制的引用)?还是我错过了什么?我正在使用 Asus Transformer Prime 10.1 TF301 平板电脑进行测试(Android 4.0.3)。

编辑

我想指出,这不是问题Color.parseColor()。Android 从不输入语句if (background != null),因此元数据根本没有被识别为字符串。

4

2 回答 2

5

解决了!这本身不是一个 Android 错误,而是一个 Android 文档错误(惊喜,惊喜!)。十六进制颜色需要一个转义字符才能正确处理:

<meta-data android:name="background"
           android:value="\#FF0000" />

在此处输入图像描述

于 2013-02-04T18:00:50.767 回答
2

解决方案 1)使用反斜杠,以便 value 是字符串而不是数字。

解决方案 2)不要调用Color.parseColor(bundle.parseString(..)),只需使用不带反斜杠的 getInt(..) 即可。

背景:

android:value="#aabbgg"是一个数字

android:value="\#aabbgg"是一个字符串

于 2013-02-04T18:29:55.667 回答