自定义ActionBar的风格

编写:Vincent 4J - 原文:http://developer.android.com/training/basics/actionbar/styling.html

Action bar 为用户提供一种熟悉可预测的方式来展示操作和导航,但是这并不意味着我们的 app 要看起来和其他 app 一样。如果想将 action bar 的风格设计的合乎我们产品的定位,只需简单地使用 Android 的 样式和主题 资源。

Android 包括一少部分内置的 activity 主题,这些主题中包含 “dark” 或 “light” 的 action bar 样式。我们也可以扩展这些主题,以便于更好的为 action bar 自定义外观。

注意:如果我们为 action bar 使用了 Support 库的 API,那我们必须使用(或重写) Theme.AppCompat 家族样式(甚至 Theme.Holo 家族,在 API level 11 或更高版本中可用)。如此一来,声明的每一个样式属性都必须被声明两次:一次使用系统平台的样式属性(android: 属性),另一次使用 Support 库中的样式属性(appcompat.R.attr 属性 - 这些属性的上下文其实就是我们的 app)。更多细节请查看下面的示例。

使用一个 Android 主题

Android 包含两个基本的 activity 主题,这两个主题决定了 action bar 的颜色:

/uploads/projects/android-training-course-in-chinese/basics/actionbar/actionbar-theme-dark@2x.png

/uploads/projects/android-training-course-in-chinese/basics/actionbar/actionbar-theme-light-solid@2x.png

这些主题即可以被应用到 app 全局,也可以通过在 manifest 文件中设置 <application> 元素 或 <activity> 元素的 android:theme 属性,对单一的 activity 进行设置。

例如:

  1. <application android:theme="@android:style/Theme.Holo.Light" ... />

可以通过声明 activity 的主题为 Theme.Holo.Light.DarkActionBar 来达到如下效果:action bar 为dark,其他部分为light。

/uploads/projects/android-training-course-in-chinese/basics/actionbar/actionbar-theme-light-darkactionbar@2x.png

当使用 Support 库时,必须使用 Theme.AppCompat 主题替代:

一定要确保我们使用的 action bar icon 的颜色与 action bar 本身的颜色有差异。Action Bar Icon Pack 为 Holo “dark”和“light”的 action bar 提供了标准的 action icon。

自定义背景

为改变 action bar的背景,可以通过为 activity 创建一个自定义主题,并重写 actionBarStyle 属性来实现。actionBarStyle 属性指向另一个样式;在该样式里,通过指定一个 drawable 资源来重写 background 属性。

/uploads/projects/android-training-course-in-chinese/basics/actionbar/actionbar-theme-custom@2x.png

如果我们的 app 使用了 navigation tabssplit action bar ,也可以通过分别设置 backgroundStackedbackgroundSplit 属性来为这些条指定背景。

Note:为自定义主题和样式声明一个合适的父主题,这点很重要。如果没有父样式,action bar将会失去很多默认的样式属性,除非我们自己显式的对他们进行声明。

仅支持 Android 3.0 和更高

当仅支持 Android 3.0 和更高版本时,可以通过如下方式定义 action bar 的背景:

res/values/themes.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!-- 应用于程序或者活动的主题 -->
  4. <style name="CustomActionBarTheme"
  5. parent="@android:style/Theme.Holo.Light.DarkActionBar">
  6. <item name="android:actionBarStyle">@style/MyActionBar</item>
  7. </style>
  8. <!-- ActionBar 样式 -->
  9. <style name="MyActionBar"
  10. parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
  11. <item name="android:background">@drawable/actionbar_background</item>
  12. </style>
  13. </resources>

然后,将主题应用到 app 全局或单个的 activity 之中:

  1. <application android:theme="@style/CustomActionBarTheme" ... />

支持 Android 2.1 和更高

当使用 Support 库时,上面同样的主题必须被替代成如下:

res/values/themes.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!-- 应用于程序或者活动的主题 -->
  4. <style name="CustomActionBarTheme"
  5. parent="@style/Theme.AppCompat.Light.DarkActionBar">
  6. <item name="android:actionBarStyle">@style/MyActionBar</item>
  7. <!-- 支持库兼容 -->
  8. <item name="actionBarStyle">@style/MyActionBar</item>
  9. </style>
  10. <!-- ActionBar 样式 -->
  11. <style name="MyActionBar"
  12. parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
  13. <item name="android:background">@drawable/actionbar_background</item>
  14. <!-- 支持库兼容 -->
  15. <item name="background">@drawable/actionbar_background</item>
  16. </style>
  17. </resources>

然后,将主题应用到 app 全局或单个的 activity 之中:

  1. <application android:theme="@style/CustomActionBarTheme" ... />

自定义文本颜色

修改 action bar 中的文本颜色,需要分别设置每个元素的属性:

  • Action bar 的标题:创建一种自定义样式,并指定 textColor 属性;同时,在自定义的 actionBarStyle 中为 titleTextStyle 属性指定为刚才的自定义样式。

注意:被应用到 titleTextStyle 的自定义样式应该使用 TextAppearance.Holo.Widget.ActionBar.Title 作为父样式。

仅支持 Android 3.0 和更高

当仅支持 Android 3.0 和更高时,样式 XML 文件应该是这样的:

res/values/themes.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!-- 应用于程序或者活动的主题 -->
  4. <style name="CustomActionBarTheme"
  5. parent="@style/Theme.Holo">
  6. <item name="android:actionBarStyle">@style/MyActionBar</item>
  7. <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
  8. <item name="android:actionMenuTextColor">@color/actionbar_text</item>
  9. </style>
  10. <!-- ActionBar 样式 -->
  11. <style name="MyActionBar"
  12. parent="@style/Widget.Holo.ActionBar">
  13. <item name="android:titleTextStyle">@style/MyActionBarTitleText</item>
  14. </style>
  15. <!-- ActionBar 标题文本 -->
  16. <style name="MyActionBarTitleText"
  17. parent="@style/TextAppearance.Holo.Widget.ActionBar.Title">
  18. <item name="android:textColor">@color/actionbar_text</item>
  19. </style>
  20. <!-- ActionBar Tab标签 文本样式 -->
  21. <style name="MyActionBarTabText"
  22. parent="@style/Widget.Holo.ActionBar.TabText">
  23. <item name="android:textColor">@color/actionbar_text</item>
  24. </style>
  25. </resources>

支持 Android 2.1 和更高

当使用 Support 库时,样式 XML 文件应该是这样的:

res/values/themes.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!-- 应用于程序或者活动的主题 -->
  4. <style name="CustomActionBarTheme"
  5. parent="@style/Theme.AppCompat">
  6. <item name="android:actionBarStyle">@style/MyActionBar</item>
  7. <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
  8. <item name="android:actionMenuTextColor">@color/actionbar_text</item>
  9. <!-- 支持库兼容 -->
  10. <item name="actionBarStyle">@style/MyActionBar</item>
  11. <item name="actionBarTabTextStyle">@style/MyActionBarTabText</item>
  12. <item name="actionMenuTextColor">@color/actionbar_text</item>
  13. </style>
  14. <!-- ActionBar 样式 -->
  15. <style name="MyActionBar"
  16. parent="@style/Widget.AppCompat.ActionBar">
  17. <item name="android:titleTextStyle">@style/MyActionBarTitleText</item>
  18. <!-- 支持库兼容 -->
  19. <item name="titleTextStyle">@style/MyActionBarTitleText</item>
  20. </style>
  21. <!-- ActionBar 标题文本 -->
  22. <style name="MyActionBarTitleText"
  23. parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
  24. <item name="android:textColor">@color/actionbar_text</item>
  25. <!-- 文本颜色属性textColor是可以配合支持库向后兼容的 -->
  26. </style>
  27. <!-- ActionBar Tab标签文本样式 -->
  28. <style name="MyActionBarTabText"
  29. parent="@style/Widget.AppCompat.ActionBar.TabText">
  30. <item name="android:textColor">@color/actionbar_text</item>
  31. <!-- 文本颜色属性textColor是可以配合支持库向后兼容的 -->
  32. </style>
  33. </resources>

自定义 Tab Indicator

为 activity 创建一个自定义主题,通过重写 actionBarTabStyle 属性来改变 navigation tabs 使用的指示器。actionBarTabStyle 属性指向另一个样式资源;在该样式资源里,通过指定一个state-list drawable 来重写 background 属性。 自定义ActionBar的风格 - 图5

注意:一个state-list drawable 是重要的,它可以通过不同的背景来指出当前选择的 tab 与其他 tab 的区别。更多关于如何创建一个 drawable 资源来处理多个按钮状态,请阅读 State List 文档。

例如,这是一个状态列表 drawable,为一个 action bar tab 的多种不同状态分别指定背景图片:

res/drawable/actionbar_tab_indicator.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!-- 按钮没有按下的状态 -->
  4. <!-- 没有焦点的状态 -->
  5. <item android:state_focused="false" android:state_selected="false"
  6. android:state_pressed="false"
  7. android:drawable="@drawable/tab_unselected" />
  8. <item android:state_focused="false" android:state_selected="true"
  9. android:state_pressed="false"
  10. android:drawable="@drawable/tab_selected" />
  11. <!-- 有焦点的状态 (例如D-Pad控制或者鼠标经过) -->
  12. <item android:state_focused="true" android:state_selected="false"
  13. android:state_pressed="false"
  14. android:drawable="@drawable/tab_unselected_focused" />
  15. <item android:state_focused="true" android:state_selected="true"
  16. android:state_pressed="false"
  17. android:drawable="@drawable/tab_selected_focused" />
  18. <!-- 按钮按下的状态D -->
  19. <!-- 没有焦点的状态 -->
  20. <item android:state_focused="false" android:state_selected="false"
  21. android:state_pressed="true"
  22. android:drawable="@drawable/tab_unselected_pressed" />
  23. <item android:state_focused="false" android:state_selected="true"
  24. android:state_pressed="true"
  25. android:drawable="@drawable/tab_selected_pressed" />
  26. <!--有焦点的状态 (例如D-Pad控制或者鼠标经过)-->
  27. <item android:state_focused="true" android:state_selected="false"
  28. android:state_pressed="true"
  29. android:drawable="@drawable/tab_unselected_pressed" />
  30. <item android:state_focused="true" android:state_selected="true"
  31. android:state_pressed="true"
  32. android:drawable="@drawable/tab_selected_pressed" />
  33. </selector>

仅支持 Android 3.0 和更高

当仅支持 Android 3.0 和更高时,样式 XML 文件应该是这样的:

res/values/themes.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!-- 应用于程序或活动的主题 -->
  4. <style name="CustomActionBarTheme"
  5. parent="@style/Theme.Holo">
  6. <item name="android:actionBarTabStyle">@style/MyActionBarTabs</item>
  7. </style>
  8. <!-- ActionBar tabs 标签样式 -->
  9. <style name="MyActionBarTabs"
  10. parent="@style/Widget.Holo.ActionBar.TabView">
  11. <!-- 标签指示器 -->
  12. <item name="android:background">@drawable/actionbar_tab_indicator</item>
  13. </style>
  14. </resources>

支持 Android 2.1 和更高

当使用 Support 库时,样式 XML 文件应该是这样的:

res/values/themes.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!-- 应用于程序或活动的主题 -->
  4. <style name="CustomActionBarTheme"
  5. parent="@style/Theme.AppCompat">
  6. <item name="android:actionBarTabStyle">@style/MyActionBarTabs</item>
  7. <!-- 支持库兼容 -->
  8. <item name="actionBarTabStyle">@style/MyActionBarTabs</item>
  9. </style>
  10. <!-- ActionBar tabs 样式 -->
  11. <style name="MyActionBarTabs"
  12. parent="@style/Widget.AppCompat.ActionBar.TabView">
  13. <!-- 标签指示器 -->
  14. <item name="android:background">@drawable/actionbar_tab_indicator</item>
  15. <!-- 支持库兼容 -->
  16. <item name="background">@drawable/actionbar_tab_indicator</item>
  17. </style>
  18. </resources>

更多资源