用例子解释Android的TextAppearance属性

1,731 阅读2分钟

AndroidTextAppearance 属性是一个特殊的属性,用于将特定的文本样式应用到你的View 组件。

创建TextAppearance 属性是为了帮助安卓开发者为他们的应用程序创建一个模块化的风格设计系统。

一个单一的AndroidView 组件可以有一个style 属性应用于它。你不能应用两种风格,如下图所示:

<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Hello World!"
 style="@style/PaddingSmall"
 style="@style/TextAppearance.Important"
/>

TextAppearance 属性是用来克服上述限制的。

下面是一个如何定义TextAppearance 属性的例子:

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <style name="TextAppearance.Important" parent="">
 <item name="android:textSize">28sp</item>
 <item name="android:color">@color/black</item>
 </style>
</resources>

上面的TextAppearance 样式可以使用android:textAppearance 属性应用到视图中。

下面是一个将该样式应用于一个TextView 组件的例子:

<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Hello World!"
 android:textAppearance="@style/TextAppearance.Important"
/>

设置了android:textAppearance 属性后,Android将把样式应用到组件上。

TextAppearance 属性的工作原理和style 属性一样,但它只能应用以下的属性列表:

  • textSize
  • typeface
  • textStyle
  • textColor
  • textColorHighlight
  • textColorHint
  • textColorLink
  • shadowColor
  • shadowDx
  • shadowDy
  • shadowRadius
  • textAllCaps
  • fontFamily
  • elegantTextHeight
  • letterSpacing
  • fontFeatureSettings
  • fontVariationSettings
  • fallbackLineSpacing
  • textFontWeight
  • textLocale
  • lineBreakStyle
  • lineBreakWordStyle

你可以添加一个TextAppearance 不支持的样式属性,但该样式不会被应用到组件上。

例如,假设你在以前的TextAppearance 样式中添加一个layout_width 属性:

<style name="TextAppearance.Important" parent="">
<item name="android:textSize">28sp</item>
<item name="android:color">@color/black</item>
 <item name="android:layout_width">match_parent</item>
</style>

在XML资源文件中不会有错误,但该属性仍然会被忽略。

当你从TextView 删除android:layout_width 属性时,Android Studio将产生以下错误:

Element TextView doesn't have required attribute android:layout_width

要应用TextAppearance 属性不支持的样式,你需要使用style 属性来应用。

例如,这里有一个在XML资源文件中创建的PaddingSmall 样式:

<style name="PaddingSmall">
<item name="android:padding">8dp</item>
</style>

你可以像这样将该样式应用到你的组件上:

<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Hello World!"
 style="@style/PaddingSmall"
 android:textAppearance="@style/TextAppearance.Important"
/>

通过使用TextAppearance 属性,你可以定义与常规样式分离的特定文本样式,允许你对视图组件应用两种不同的样式规则。

安卓的样式层次和TextAppearance

请注意,你添加到View 定义本身的任何相同的样式将覆盖在TextAppearance 属性中定义的样式。

根据它们的重要性,下面是Android风格化的工作方式:

  • 程序性应用的属性
  • 应用于视图的属性
  • 应用一个特定的样式
  • 视图的默认样式
  • 为你的应用程序提供一个通用的主题
  • 视图的特定样式,如TextAppearance

正如你所看到的,TextAppearance 属性被赋予最低的优先级。当你为你的组件设计样式时,请记住这个层次结构。

当你没有看到组件的外观有任何变化时,那么很可能你有其他规则应用于视图,这些规则覆盖了TextAppearance 样式。

而这就是TextAppearance 属性在Android中的工作原理。👌

更多信息,请参见AndroidTextAppearance 解释