什么时候应该使用主题。应用程序与主题叠加。应用程序?

有以下的 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

Why would one use ThemeOverlay.AppCompat.light vs Theme.AppCompat.Light for example? I see that there are much less attributes defined for ThemeOverlay -- I am curious what the intended use case for ThemeOverlay is.

63090 次浏览

根据 AppCompat 的创建者的 主题与风格博客文章:

[主题叠加]是覆盖普通主题的特殊主题。材质主题,覆盖相关属性,使它们或明或暗。

主题叠加 + 动作栏

你们这些眼尖的人也会看到 ActionBar 的主题覆盖衍生品:

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

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

唯一的事情,这些目前做不同于他们的父母是,他们改变 colorControlNormalandroid:textColorPrimary,从而使任何文本和图标不透明。

主题。AppCompat 用于设置整个应用程序的全局主题。主题叠加。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

由于我的主色是深蓝色,我可能应该使用一个主题,使用浅文本颜色在行动栏,因为黑色的文本是难以阅读。

Hiding the ActionBar and using a Toolbar

使用主题的全部意义。AppCompat 而不是 Theme。材质是让我们可以允许旧版本的 Android 使用我们的材质设计主题。问题是旧版本的 Android 不支持 ActionBar。因此,文件建议隐藏 ActionBar 并在布局中添加一个 Toolbar。要隐藏 ActionBar,我们必须使用 NoActionBar主题之一。下面的图片显示了隐藏了 ActionBar 的工具栏。

enter image description here

但是如果我想要一个带有黑暗动作栏的光主题呢?因为我必须使用 NoActionBar,所以这不是一个选项。

重写应用程序主题

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

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

这最终让我们得到了我们想要的效果。黑暗。ActionBar 主题 覆盖图这个特殊场合的 Light 应用程序主题。

enter image description here

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

如果你希望弹出菜单轻巧,你可以添加以下内容:

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

进一步研究

I learned this through experimentation and through reading the following articles.