什么时候应该使用Theme.AppCompat vs ThemeOverlay.AppCompat?
有以下的Theme.AppCompat类:
Theme.AppCompat Theme.AppCompat.Light Theme.AppCompat.Light.DarkActionBar Theme.AppCompat.NoActionBar Theme.AppCompat.Light.NoActionBar Theme.AppCompat.DialogWhenLarge Theme.AppCompat.Light.DialogWhenLarge Theme.AppCompat.Dialog Theme.AppCompat.Light.Dialog Theme.AppCompat.CompactMenu
和以下ThemeOverlay.AppCompat类:
ThemeOverlay.AppCompat ThemeOverlay.AppCompat.Light ThemeOverlay.AppCompat.Dark ThemeOverlay.AppCompat.ActionBar ThemeOverlay.AppCompat.Dark.ActionBar
为什么会使用ThemeOverlay.AppCompat.light vs Theme.AppCompat.Light? 我看到为ThemeOverlay定义的属性less得多 – 我很好奇ThemeOverlay的预期用例是什么。
按照AppCompat的创build者的主题和风格的博客文章 :
[ThemeOverlays]是覆盖正常的主题,覆盖相关的属性,使它们不论是明暗的特殊主题。
ThemeOverlay + ActionBar
敏锐的目光也会看到ActionBar ThemeOverlay派生物:
ThemeOverlay.Material.Light.ActionBar
ThemeOverlay.Material.Dark.ActionBar
这些只能通过新的
actionBarTheme
属性与Action Bar一起使用,或直接在工具栏上设置。这些目前唯一不同于父母的是他们将
colorControlNormal
改为android:textColorPrimary
,从而使任何文本和图标都不透明。
Theme.AppCompat用于设置整个应用程序的全局主题。 ThemeOverlay.AppCompat用于覆盖(或“覆盖”)特定视图的主题,特别是工具栏。
让我们看看为什么这是必要的例子。
应用程序的主题与一个ActionBar
ActionBar通常显示在一个应用程序中。 我可以通过设置colorPrimary
值来select它的颜色。 但是,更改主题会更改ActionBar上文本的颜色。
<style name="AppTheme" parent="Theme.AppCompat"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style>
由于我的主要颜色是深蓝色,所以我应该使用在操作栏中使用浅色文本颜色的主题之一,因为黑色文本难以阅读。
隐藏ActionBar并使用工具栏
使用Theme.AppCompat而不是Theme.Material的重点是让我们可以允许旧版本的Android使用我们的材料devise主题。 问题是旧版本的Android不支持ActionBar。 因此, 文档build议隐藏ActionBar并添加一个工具栏到您的布局。 要隐藏ActionBar,我们必须使用NoActionBar
主题之一。 以下图像显示隐藏了ActionBar的工具栏。
但是如果我想要一个像DarkActionBar一样的Light主题呢? 因为我必须使用NoActionBar,那不是一个选项。
覆盖应用程序的主题
这里是ThemeOverlay进来的地方。我可以在我的工具栏xml布局中指定Dark ActionBar主题。
<android.support.v7.widget.Toolbar ... android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
这最终使我们有我们想要的效果。 Dark.ActionBar主题覆盖了这个特定场合的Light应用程序主题。
- 应用主题:
Theme.AppCompat.Light.NoActionBar
- 工具栏主题:
ThemeOverlay.AppCompat.Dark.ActionBar
如果你想popup菜单是轻的,你可以添加这个:
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
进一步研究
我通过实验和阅读以下文章了解了这一点。
- 设置应用程序栏
- 使用android:主题和ThemeOverlay来主题特定的视图及其后代
- 用AppCompat构build
- 使用colorPrimary来着色你的应用程序栏
- 主题与风格