什么时候应该使用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来着色你的应用程序栏
  • 主题与风格