我想访问编译到我的apk中的复杂资源(“包资源”)。例如,获取当前主题的所有属性,最好是我可以遍历的xml。
可以使用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>
应用程序如何在不知道其名称的情况下获取这些标志?
答案 0 :(得分:3)
而不是Theme.obtainStyledAttributes(...)
,Resources.obtainTypedArray(int)
可用于访问样式的所有属性,而无需指定您感兴趣的属性。
然后,您可以访问TypedArray的元素以查找每个属性的资源ID /类型/值。
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
}
}
答案 1 :(得分:1)
可能有更好的方法,但您始终可以使用getXml
访问“原始”XML