Читайте новые атрибуты темы на более старой платформе
Я пытаюсь прочитать значения атрибутов из тем и стилей, которые были разработаны для платформ, которые новее, чем я запускаю свое приложение.
Пожалуйста, не спрашивайте почему. Если вы знаете что-нибудь о библиотеках, которые я пишу, вы уже должны знать, что мне нравится использовать возможности платформы :)
Я работаю в предположении, что при компиляции стилей Android константы атрибутов - это то, что используется для ключей, и, следовательно, теоретически должно каким-то образом считываться на любой платформе. Это то, что я наблюдал, чтобы происходило с макетами XML в других моих библиотеках без проблем.
Вот базовый тестовый пример, который показывает проблему. Это должно быть скомпилировано с использованием 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>
Тот факт, что это используетandroid:actionBarStyle
конкретно не имеет отношения к делу. Все, что следует понимать, это то, что это атрибут, который был доступен только начиная с Android 3.0.
Вот способ, которым я пытался получить доступ к этим значениям до сих пор на платформахдо Android 3.0.
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Break Me"
style="?android:attr/actionBarStyle"
/>
а также
<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"
/>
а также
TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarStyle, outValue, true);
а также
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);
а также
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionBar, android.R.attr.actionBarStyle, 0);
Все они приводят к этой ошибке в LogCat:
E/ResourceType(5618): Style contains key with bad entry: 0x010102ce
0x010102ce
константа является значением атрибутаandroid.R.attr.actionBarStyle
что, похоже, указывает на то, что платформа отклоняет атрибут, прежде чем я смогу получить доступ к его значению.
Я ищу любой другой способ прочитать атрибуты, подобные этому, в теме. Я вполне уверен, что как только я получу ссылку на стиль, у меня не будет проблем с чтением его атрибутов.
Есть ли какой-нибудь возможный способ сделать это?