Программный доступ к темам / стилям / атрибутам в Android - PullRequest
6 голосов
/ 30 ноября 2011

Я хотел бы получить доступ к сложным ресурсам («пакетным ресурсам»), скомпилированным в мой apk. Например, получить все атрибуты текущей темы, желательно в виде xml, который я могу пройти.

Доступ к темам / стилям можно получить с помощью receiveStyledAttributes (), но для этого необходимо заранее знать атрибуты. Есть ли способ получить список атрибутов, которые существуют в стиле?

Например, в такой теме:

<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 ]

3 голосов
/ 19 января 2012

Вместо Theme.obtainStyledAttributes(...), Resources.obtainTypedArray(int) может использоваться для доступа ко всем атрибутам стиля, без указания того, какие атрибуты вас интересуют.

Затем вы можете получить доступ к элементам TypedArray.найти идентификатор ресурса / типы / значения каждого атрибута.

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 голос
/ 12 января 2012

Возможно, есть лучший способ, но вы всегда можете получить доступ к «сырому» XML, используя getXml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...