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

Android 什么时候应该使用Theme.AppCompat与ThemeOverlay.AppCompat?,android,android-theme,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类:

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.Light
ThemeOverlay.AppCompat.Dark
ThemeOverlay.AppCompat.ActionBar
ThemeOverlay.AppCompat.Dark.ActionBar
以及以下ThemeOverlay.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.Light
ThemeOverlay.AppCompat.Dark
ThemeOverlay.AppCompat.ActionBar
ThemeOverlay.AppCompat.Dark.ActionBar
例如,为什么要使用ThemeOverlay.AppCompat.light和Theme.AppCompat.light?我发现为MeoOverlay定义的属性要少得多——我很好奇MeoOverlay的预期用例是什么。

根据AppCompat的创建者所述:

[ThemeOverlays]是覆盖普通主题的特殊主题。材质主题,覆盖相关属性使其变为浅/暗

ThemeOverlay+操作栏

目光敏锐的您也会看到ActionBar ThemeOverlay衍生品:

  • ThemeOverlay.Material.Light.ActionBar
  • ThemeOverlay.Material.Dark.ActionBar
这些选项只能通过新的
actionBarTheme
属性与操作栏一起使用,或者直接在工具栏上设置

他们目前对父母唯一不同的做法是将
colorControlNormal
更改为
android:textColorPrimary
,从而使任何文本和图标不透明


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

让我们看一个例子来说明为什么这是必要的

带有ActionBar的应用程序主题 ActionBar通常显示在应用程序中。我可以通过设置
colorPrimary
值来选择它的颜色。但是,更改主题会更改操作栏上文本的颜色

<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>
这最终使我们能够达到我们想要的效果。Dark.ActionBar主题与Light应用程序主题重叠,用于此特定场合

  • 应用程序主题:
    Theme.AppCompat.Light.NoActionBar
  • 工具栏主题:
    ThemeOverlay.AppCompat.Dark.ActionBar
如果您希望弹出菜单变轻,可以添加以下内容:

app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
进一步研究 我通过实验和阅读以下文章了解到了这一点


如何在使用MeoOverlay时使状态栏透明?我想知道如何使用新的MaterialToolbar@David,我现在大部分时间都在与Flutter合作,所以我没有跟上安卓系统的新发展。如果你找到了答案,请随时回到这里,留下评论,编辑我的答案,或者添加你自己的答案。