2011-11-30 10 views
6

Desidero accedere a risorse complesse ("risorse bag") compilate nel mio apk. Ad esempio, ottenendo tutti gli attributi del tema corrente, preferibilmente come un xml che posso attraversare.Accesso programmatico a temi/stili/attrs in Android

È possibile accedere a temi/stili utilizzando getStyledAttributes(), ma è necessario conoscere in anticipo gli attributi. C'è un modo per ottenere una lista degli attributi che esistono in uno stile?

Per esempio, in un tema come questo:

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

come posso accedere alle voci senza conoscere i loro nomi in anticipo?

Un altro esempio potrebbe essere attrs.xml, dove alcuni attributi hanno enumerazioni o bandiere, come questa:

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

Come può un'applicazione ottenere questi bandiere senza conoscere il loro nome?

risposta

1

v'è probabilmente un modo migliore, ma si può sempre accedere al XML 'crudo' utilizzando getXml

+0

Grazie per la risposta. L'ho provato prima, ma apparentemente le risorse "bag" non sono riconosciute come xml. Non è riuscito con un errore, in quanto la risorsa è una risorsa bag piuttosto che una risorsa xml. –

3

Invece di Theme.obtainStyledAttributes(...), Resources.obtainTypedArray(int) può essere utilizzato per accedere a tutti gli attributi per uno stile, senza dover specificare quali attributi

È quindi possibile accedere agli elementi di TypedArray per trovare l'ID/tipi/valori di risorsa di ciascun attributo.

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

Grazie! Che funzioni. –

+0

Potrei mancare qualcosa, ma 'value.resourceId' sembra essere lo stesso di' array.getResourceId (int, int) '- cioè, è la fonte del valore, non il codice' R.attr' per il campo di stile. Un valore costante avrà un 'resourceId' di 0; un valore come '" @ string/foo "' avrà 'R.string.foo'. –

Problemi correlati