主题中的自定义项目

时间:2015-01-04 15:46:55

标签: android android-styles

我想创建我将在TextView的android:textAppearance中使用的样式。但是这种风格在不同的API级别上有所不同,所以我希望:

  • 一种常见的样式(适用于所有API级别),
  • 在值-v16,values-v21 dirs,
  • 中的常见样式之后继承的一些样式
  • 一个指令(style / attr?)我将放入TextView的android:textAppearance参数(布局文件适用于所有API级别)。

我尝试了Google和Stack的多种组合,最后结束了这样的事情(当然不行):

值/ attrs.xml

<attr name="myTextAppearance" format="reference" />

值/ styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="myTextAppearance">@style/CommonTextAppearance</item>
</style>

<style name="CommonTextAppearance">
    <item name="android:textColor">#00f</item>
</style>

值-V16 / styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="myTextAppearance">@style/V16TextAppearance</item>
</style>

<style name="V16TextAppearance" parent="CommonTextAppearance">
    <item name="android:textSize">20sp</item>
</style>

布局/ activity_main.xml中

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@android:id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Lorem"
        android:textAppearance="?attr/myTextAppearance"/>

</RelativeLayout>

目前我收到了一个错误:

  

无法找到当前主题的主题资源?attr / myTextAppearance

我花了很多时间尝试自己做这件事,但我失败了。你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

这是因为?attr / [name]值是对所有者样式参数的引用。如果没有[name]的参数,则代码将回退到主题中定义的默认参数集。

基本上,TextView类检查layout xml中定义的内联样式,然后是默认主题,然后是textViewStyle引用。它们都不包含myTextAppearance属性。

您必须覆盖视图,并在构造函数中使用obtainStyledAttributes。将您的主题属性作为默认属性传递。然后解析该值并将其用作新的文本外观。

http://developer.android.com/reference/android/content/res/Resources.Theme.html#obtainStyledAttributes(android.util.AttributeSet,int[],int,int)

http://developer.android.com/reference/android/view/View.html#View(android.content.Context,android.util.AttributeSet,int)