Je suis en train de lire les valeurs d'attribut à partir de thèmes et de styles qui ont été conçus pour les plates-formes qui sont plus récents que je suis en cours d'exécution de mon application.
S'il vous plaît ne me demandez pas pourquoi. Si vous savez quelque chose sur les bibliothèques j'écris, alors vous devriez déjà savoir que j'aime tester les capacités de la plate-forme :)
Je suis d'exploitation en vertu de la présomption que quand Android styles sont compilées à l'attribut constantes sont ce qui est utilisé pour les touches et, par conséquent, en théorie, doit pouvoir être lu sur n'importe quel plate-forme en quelque sorte. C'est ce que j'ai observé à se produire avec mise en page XMLs dans mes autres bibliothèques sans trop de mal.
Voici une base de cas de test qui montre le problème. Ce doit être compilé à l'aide de Android 3.0+.
<resources>
<style name="Theme.BreakMe">
<item name="android:actionBarStyle">@style/Widget.BreakMe</item>
</style>
<style name="Widget.BreakMe" parent="android:Widget">
<item name="android:padding">20dp</item>
</style>
</resources>
Le fait qu'il utilise android:actionBarStyle
plus précisément, c'est irreleveant. Tout ce qui doit être compris, c'est que c'est un attribut qui était uniquement disponible à partir d'Android 3.0.
Voici le chemin que j'ai essayé d'accéder à ces valeurs jusqu'à présent sur les plates-formes avant d'Android 3.0.
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Break Me"
style="?android:attr/actionBarStyle"
/>
et
<declare-styleable name="Whatever">
<item name="datStyle" format="reference" />
</declare-styleable>
<style name="Theme.BreakMe.Take2">
<item name="datStyle">?android:attr/actionBarSize</item>
</style>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Break Me"
style="?attr/datStyle"
/>
et
TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarStyle, outValue, true);
et
int[] Theme = new int[] { android.R.attr.actionBarSize };
int Theme_actionBarSize = 0;
TypedArray a = context.obtainStyledAttributes(attrs, Theme);
int ref = a.getResourceId(Theme_actionBarSize, 0);
et
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionBar, android.R.attr.actionBarStyle, 0);
Tous d'entre eux à l'origine de cette erreur dans le LogCat:
E/ResourceType(5618): Style contains key with bad entry: 0x010102ce
L' 0x010102ce
constante, c'est la valeur de l'attribut d' android.R.attr.actionBarStyle
ce qui semble indiquer la plate-forme est le rejet de l'attribut avant que je puisse même avoir une chance d'accéder à sa valeur.
Je suis à la recherche de toute autre manière de lire les attributs comme ce Thème. Je suis assez sûr qu'une fois que j'ai obtenu le style de référence, je ne vais pas avoir des problèmes de lecture de ses attributs.
Est-il possible de faire cela?