Я пытаюсь прочитать значения атрибутов из тем и стилей, которые были разработаны для платформ, которые новее, чем я запускаю свое приложение.
Пожалуйста, не спрашивайте почему. Если вы знаете что-нибудь о библиотеках, которые я пишу, вы уже должны знать, что мне нравится использовать возможности платформы:)
Я работаю в предположении, что при компиляции стилей 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
, которое, по-видимому, указывает на то, что платформа отклоняет атрибут, прежде чем я даже смогу получить доступ к его значению.
Я ищу какой-либо другой способ прочитать подобные атрибуты из Темы. Я вполне уверен, что как только я получу ссылку на стиль, у меня не будет проблем с чтением его атрибутов.
Есть ли способ сделать это?