我正在尝试从为比我运行应用程序更新的平台设计的主题和样式中读取属性值。
请不要问为什么。如果您对我编写的库有所了解,那么您应该已经知道我喜欢推动平台的功能:)
我的假设是,编译 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
它似乎表明平台在我什至有机会访问它的值之前就拒绝了该属性。
我正在寻找从主题中读取此类属性的任何其他方式。我相当肯定,一旦我获得了样式参考,我就不会在阅读它的属性时遇到麻烦。
有没有办法做到这一点?