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


113

有以下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的预期用例是什么。

Answers:


71

根据AppCompat的创建者撰写的主题与样式博客文章

[ThemeOverlays]是特殊的主题,它们覆盖了正常的Theme.Material主题,覆盖了相关的属性以使其为亮/暗。

ThemeOverlay + ActionBar

敏锐的注视您还将看到ActionBar ThemeOverlay派生类:

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

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

这些文件当前对父母所做的唯一更改是将它们更改colorControlNormalandroid:textColorPrimary,从而使任何文本和图标都不透明。


155

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>

在此处输入图片说明

由于我的原色是深蓝色,因此我可能应该在操作栏中使用使用浅色文本的主题之一,因为黑色文本难以阅读。

隐藏ActionBar并使用工具栏

使用Theme.AppCompat而不是Theme.Material的全部目的是为了使我们可以允许旧版本的Android使用我们的材质设计主题。问题是较旧的Android版本不支持ActionBar。因此,文档建议隐藏ActionBar并将Toolbar添加到布局中。要隐藏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

如果希望弹出菜单变亮,可以添加以下内容:

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

进一步研究

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


使用Themeoverlay时如何使状态栏透明?
gegobyte

我想知道如何通过新的MaterialToolbar实现此目标
David

@David,我现在主要是在Flutter上工作,所以我没有跟上新的Android开发。如果您发现答案,请随时返回此处并发表评论,编辑我的答案或添加您自己的答案。
Suragch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.