2011-11-30 20 views
6

Me gustaría acceder a recursos complejos ("recursos de bolsa") compilados en mi apk. Por ejemplo, obtener todos los atributos del tema actual, preferiblemente como un xml que puedo recorrer.Acceso a temas/estilos/attrs de manera programada en android

Se puede acceder a temas/estilos usando getStyledAttributes() pero requiere conocer los atributos de antemano. ¿Hay alguna manera de obtener una lista de los atributos que existen en un estilo?

Por ejemplo, en un tema como éste:

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

cómo puedo acceder a los artículos sin conocer sus nombres de antemano?

Otro ejemplo sería attrs.xml, donde algunos atributos tienen enumeraciones o banderas, como esto:

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

¿Cómo puede una aplicación obtener estas banderas sin saber su nombre?

Respuesta

1

es probable que haya una mejor manera, pero siempre se puede acceder al XML 'en bruto' usando getXml

+0

Gracias por responder. Intenté eso primero, pero aparentemente los recursos de "bolsa" no se reconocen como xml. Falló con un error, sobre el recurso que es un recurso de bolsa en lugar de un recurso xml. –

3

En lugar de Theme.obtainStyledAttributes(...), Resources.obtainTypedArray(int) puede ser utilizado para acceder a todos los atributos de un estilo, sin tener que especificar qué atributos usted está interesado en.

A continuación, puede acceder a los elementos de TypedArray para encontrar el id de recurso/tipos/valores de cada atributo.

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

¡Gracias! Eso funciona. –

+0

Me puede estar faltando algo, pero 'value.resourceId' parece ser el mismo que' array.getResourceId (int, int) '- es decir, es la fuente del valor, no el código' R.attr' para el campo de estilo. Un valor constante tendrá un 'resourceId' de 0; un valor como '" @ string/foo "' tendrá 'R.string.foo'. –

Cuestiones relacionadas