2011-11-30 61 views
6

我想访问编译到我的apk中的复杂资源(“包资源”)。例如,获取当前主题的所有属性,最好是作为一个xml我可以遍历。以编程方式访问Android中的主题/样式/ attrs

主题/样式可以使用obtainStyledAttributes()来访问,但它需要事先知道属性。有没有办法获得一个样式中存在的属性列表?

例如,在这样一个主题:

<style name="BrowserTheme" parent="@android:Theme.Black"> 
    <item name="android:windowBackground">@color/white</item> 
    <item name="android:colorBackground">#FFFFFFFF</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
</style> 

我怎么能访问没有事先知道他们的名字的项目?

另一个例子是attrs.xml,一些属性具有枚举或标志,比如这个:

<attr name="configChanges"> 
    <flag name="mcc" value="0x00000001" /> 
    <flag name="mnc" value="0x00000002" /> 
    ... 
</attr> 

应用程序如何得到这些标志不知道他们的名字?

回答

1

有可能是一个更好的办法,但你总是可以访问使用getXml

+0

感谢您的回答。我首先尝试了,但显然“包”资源不被识别为xml。它失败了一个错误,关于资源是一个袋资源,而不是一个XML资源。 –

3

相反的Theme.obtainStyledAttributes(...),“原始” XML Resources.obtainTypedArray(int)可以用来访问所有属性的风格,而不必指定哪些属性你有兴趣。

然后你可以访问TypedArray的元素来查找每个属性的资源id/types/values。

TypedArray array = getResources().obtainTypedArray(
    R.style.NameOfStyle); 

    for (int i = 0; i < array.length(); ++i) { 

    TypedValue value = new TypedValue(); 
    array.getValue(i, value); 

    int id = value.resourceId; 

    switch (value.type) { 
     case TypedValue.TYPE_INT_COLOR_ARGB4: 
     // process color. 
     break; 

     // handle other types 
    } 
    } 
+0

谢谢!这样可行。 –

+0

我可能会遗漏一些东西,但'value.resourceId'似乎与'array.getResourceId(int,int)'相同 - 也就是说,它是值的来源,而不是'R.attr'代码风格领域。一个常量值的'resourceId'为0;像“@ string/foo”这样的值将会有'R.string.foo'。 –

相关问题