什么时候应该使用Theme.AppCompat vs ThemeOverlay.AppCompat?

时间:2014-12-01 22:20:16

标签: android android-theme

有以下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和Theme.AppCompat.Light作为示例?我发现为ThemeOverlay定义的属性要少得多 - 我很好奇ThemeOverlay的预期用例是什么。

2 个答案:

答案 0 :(得分:134)

Theme.AppCompat用于设置整个应用的全局主题。 ThemeOverlay.AppCompat用于覆盖(或“覆盖”)特定视图的主题,尤其是工具栏。

让我们看看为什么这是必要的例子。

带有ActionBar的应用主题

ActionBar通常显示在应用中。我可以通过设置colorPrimary值来选择它的颜色。但是,更改主题会更改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>

enter image description here

由于我的主要颜色是深蓝色,我应该使用操作栏中使用浅色文字颜色的主题之一,因为黑色文字难以阅读。

隐藏ActionBar并使用工具栏

使用Theme.AppCompat而不是Theme.Material的全部意义在于我们可以允许旧版本的Android使用我们的材质设计主题。问题是旧版本的Android不支持ActionBar。因此,documentation建议隐藏ActionBar并在工具栏中添加工具栏。要隐藏ActionBar,我们必须使用其中一个NoActionBar主题。以下图像显示隐藏了ActionBar的工具栏。

enter image description here

但是如果我想要一个带有DarkActionBar的Light主题呢?由于我必须使用NoActionBar,这不是一个选项。

覆盖App主题

这是ThemeOverlay的用武之地。我可以在工具栏xml布局中指定Dark ActionBar主题。

<android.support.v7.widget.Toolbar
    ...
    android:background="?attr/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

这最终使我们能够获得我们想要的效果。 Dark.ActionBar主题覆盖适用于此特定场合的Light应用主题。

enter image description here

  • 应用主题:Theme.AppCompat.Light.NoActionBar
  • 工具栏主题:ThemeOverlay.AppCompat.Dark.ActionBar

如果您想让弹出菜单变亮,可以添加:

app:popupTheme="@style/ThemeOverlay.AppCompat.Light"

进一步研究

我通过实验和阅读以下文章了解到这一点。

答案 1 :(得分:65)

AppCompat的创建者根据此Theme vs Style blog post

  

[ThemeOverlays]是特殊主题,覆盖了普通的Theme.Material主题,覆盖了相关的属性,使它们变亮或变暗。

     

ThemeOverlay + ActionBar

     

对你的敏锐看法也会看到ActionBar ThemeOverlay衍生品:

     
      
  • ThemeOverlay.Material.Light.ActionBar
  •   
  • ThemeOverlay.Material.Dark.ActionBar
  •   
     

这些只能通过新的actionBarTheme属性与操作栏一起使用,或直接在工具栏上设置。

     

目前这些与父母不同的是,他们将colorControlNormal更改为android:textColorPrimary,从而使任何文字和图标都不透明。