以编程方式访问Android中的主题/样式/ attrs

时间:2011-11-30 02:04:44

标签: android android-layout apk

我想访问编译到我的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>

应用程序如何在不知道其名称的情况下获取这些标志?

2 个答案:

答案 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