有以下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的预期用例是什么。
答案 0 :(得分:134)
Theme.AppCompat用于设置整个应用的全局主题。 ThemeOverlay.AppCompat用于覆盖(或“覆盖”)特定视图的主题,尤其是工具栏。
让我们看看为什么这是必要的例子。
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>
由于我的主要颜色是深蓝色,我应该使用操作栏中使用浅色文字颜色的主题之一,因为黑色文字难以阅读。
使用Theme.AppCompat而不是Theme.Material的全部意义在于我们可以允许旧版本的Android使用我们的材质设计主题。问题是旧版本的Android不支持ActionBar。因此,documentation建议隐藏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
如果您想让弹出菜单变亮,可以添加:
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
,从而使任何文字和图标都不透明。