为了实现主题,我定义了自定义样式属性以避免覆盖系统样式
的themes.xml
<declare-styleable name="MyThemeBase">
<attr name="myTextColorHighlight" format="reference|color"/>
</declare-styleable>
<style name="MyThemeBase" parent="@style/Theme.AppCompat.Light">
...
</style>
<style name="MY.Theme.AppCompat.Light.Orange" parent="SCThemeBase">
<item name="myTextColorHighlight">@color/textcolor_highlight_orange</item>
</style>
<style name="MY.Theme.AppCompat.Light.Blue" parent="SCThemeBase">
<item name="myTextColorHighlight">@color/textcolor_highlight_blue</item>
</style>
我还定义了自定义TextAppearance 的 styles.xml
<style name="My.TextAppearance.Medium" parent="@android:style/TextAppearance.Medium">
<!-- this line caused crash -->
<item name="android:textColor">?attr/myTextColorHighlight</item>
<!-- this worked -->
<!--<item name="android:textColor">@color/textcolor_highlight_orange</item>-->
</style>
在布局xmls中,一些TextViews在MY.TextAppearance.Medium样式上面引用,到目前为止一切看起来都那么好。但是在布局一个ListView中的TextView时,我遇到了崩溃,堆栈跟踪是
android.view.InflateException: Binary XML file line #9: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:619)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:666)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at com.xxx.yyy.MyListAdatper.getView(MyListAdatper.java:46)
最奇怪的是同样风格的其他TextView很好
我不知道为什么我遇到这个。通过一些调试,我发现它只有在My.TextAppearance.Medium的定义中使用直接颜色而不是attr引用(请在styles.xml上面查看注释)时才有效。
任何人都可以提供帮助?感谢。
答案 0 :(得分:0)
我认为问题出在你的方法上。您定义的是一个可定制的,即您希望能够为其分配不同值的自定义属性。
相反,你想要的是一个属性引用,它是一个常量id,可以根据主题分配不同的值。
为此,而不是:
<declare-styleable name="MyThemeBase">
<attr name="myTextColorHighlight" format="reference|color"/>
</declare-styleable>
刚刚提出:
<attr name="myTextColorHighlight" format="reference|color"/>
也就是说,你只需要删除&#34; declare-styleable&#34;包装。这应该使它没有问题。