Я пытаюсь читать значения атрибутов из тем и стилей, которые были разработаны для платформ, которые новее, чем я запускаю мое приложение.Чтение новых атрибутов темы на старой платформе
Пожалуйста, не спрашивайте, почему. Если вы знаете что-нибудь о библиотеках, которые я пишу, то вы уже должны знать, что мне нравится нажимать возможности платформы :)
Я работаю согласно предположению, что, когда стили 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
конкретно является irreleveant. Все, что следует понимать, это тот атрибут, который был доступен только с 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
, который, кажется, указывает платформа отвергая атрибут, прежде чем я могу даже получить шанс получить доступ к его стоимость.
Я ищу другой способ для чтения атрибутов, подобных этому с Темы. Я довольно уверен, что как только я получу ссылку на стиль, мне не составит труда прочитать ее атрибуты.
Есть ли способ для этого?
Спасибо за то, что вы так долго врывались в это. –
Little OT, Как вы знали/думали искать ResourceTypes.cpp? Я вижу много вопросов, на которые вы ответили @CommonsWare, поэтому я склонен думать о вас как эксперт по Android. –
@ radioact1ve: Я, вероятно, искал текст сообщения об ошибке. – CommonsWare