2011-11-30 7 views
6

私はapkにコンパイルされた複雑なリソース(「バッグリソース」)にアクセスしたいと思います。たとえば、現在のテーマのすべての属性を取得します。好ましくはxmlとしてトラバースできます。androidのテーマ/スタイル/ attrsにプログラム的にアクセスする

テーマ/スタイルには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> 

私は事前に自分の名前を知らなくてもアイテムにアクセスする方法:このようなテーマで例えば

、?どのようにアプリケーションが自分の名前を知らなくても、これらのフラグを取得することができます

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

別の例は、いくつかの属性は、このような列挙型またはフラグを、持っているattrs.xml、でしょうか?

答えて

1

は、おそらく良い方法はありますが、あなたは常にgetXml

+0

お返事ありがとうございます。私はまずそれを試みましたが、明らかに "バッグ"リソースはxmlとして認識されません。リソースがxmlリソースではなく、bagリソースであるというエラーで失敗しました。 –

3

代わりのTheme.obtainStyledAttributes(...)、使用して「生の」XMLにアクセスすることができます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 
    } 
    } 
+0

ありがとう!それは動作します。 –

+0

私は何か不足しているかもしれませんが、 'value.resourceId'は' array.getResourceId(int、int) 'と同じように見えます。つまり、値のソースであり、' R.attr'コードではありません。スタイルフィールド。定数値は 'resourceId'を0にします。 '' @ string/foo "'のような値は 'R.string.foo'を持ちます。 –

関連する問題