2011-11-30 20 views
6

Benim apk derlenmiş karmaşık kaynaklara ("çanta kaynakları") erişmek istiyorum. Örneğin, mevcut temanın tüm özniteliklerini, tercihen bir xml olarak alıyorum.Android'de temalar/stiller/attrs programatik olarak erişiliyor

Temalar/stiller, edinStyledAttributes() kullanılarak erişilebilir, ancak özniteliklerin önceden bilinmesi gerekir. Bir stilde var olan özniteliklerin bir listesini almanın bir yolu var mı?

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

nasıl önceden isimlerini bilmeden öğeleri erişebilirsiniz: Böyle bir tema Örneğin

? Bazı özellikler bu gibi Çeteleler veya bayrakları var

başka örnek attrs.xml olurdu:

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

Nasıl bir uygulama isimlerini bilmeden bu bayrakları alabilirim?

cevap

1

muhtemelen daha iyi bir yol yoktur, ama her zaman getXml

+0

Yanıtladığınız için teşekkür ederiz. İlk önce denedim ama görünüşe göre "çanta" kaynakları xml olarak tanınmıyor. Kaynak, bir xml kaynağı yerine bir çanta kaynağı olan bir hatayla başarısız oldu. –

3

yerine Theme.obtainStyledAttributes(...) kullanarak 'ham' XML erişebilir Resources.obtainTypedArray(int) niteliklerini belirtmek zorunda kalmadan, bir stil için tüm niteliklerine erişmek için kullanılabilir ilginizi çekebilir

Ardından, her özelliğin kaynak kimliğini/türlerini/değerlerini bulmak için TypedArray öğelerinin öğelerine erişebilirsiniz.

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

Teşekkürler! Bu işe yarıyor. –

+0

Bir şey eksik olabilir, ancak 'value.resourceId'' array.getResourceId (int, int) 'ile aynı gibi görünüyor - yani, bu değerin kaynağı değil, 'rdattr' kodu stil alanı Sabit bir değer, 0'dan bir 'resourceId' değerine sahip olacaktır; '@ @ string/foo 'gibi bir değer' R.string.foo' olacaktır. –

İlgili konular