2014-12-01 63 views
85

有以下Theme.AppCompat類:什麼時候應該使用Theme.AppCompat vs 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 
ThemeOverlay.AppCompat.Light 
ThemeOverlay.AppCompat.Dark 
ThemeOverlay.AppCompat.ActionBar 
ThemeOverlay.AppCompat.Dark.ActionBar 

一個爲什麼要使用ThemeOverlay.AppCompat.light VS Theme.AppCompat.Light例如?我發現爲ThemeOverlay定義的屬性更少 - 我很好奇ThemeOverlay的預期用例是什麼。

回答

54

每本Theme vs Style blog post通過程序兼容性的創造者:

[ThemeOverlays]是其覆蓋正常Theme.Material主題特別主題,覆蓋相關屬性,使他們無論是亮/暗。

ThemeOverlay +動作條

你敏銳的眼睛也已經看到了動作條ThemeOverlay衍生物:

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

這些只應使用行動欄通過新的actionBarTheme屬性,或直接在工具欄上設置。

這些目前唯一不同於他們的父母的是他們將colorControlNormal更改爲android:textColorPrimary,從而使任何文本和圖標不透明。

89

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> 

enter image description here

由於我的原色是深藍色的,我也許應該使用使用光文本顏色操作欄中,因爲黑色文本難以閱讀的主題之一。

隱藏動作條,並使用工具欄

使用Theme.AppCompat而不是Theme.Material的整點是讓我們可以允許舊版Android的使用我們的材料設計主題。問題是舊版Android不支持ActionBar。因此,documentation建議隱藏ActionBar並向您的佈局添加一個工具欄。要隱藏ActionBar,我們必須使用NoActionBar主題之一。以下圖像顯示隱藏了ActionBar的工具欄。

​​

但是,如果我想要的東西就像一個DarkActionBar光的主題是什麼?由於我必須使用NoActionBar,這不是一個選項。

重寫應用主題

這裏就是ThemeOverlay用武之地。我可以指定我的工具欄XML佈局黑暗的動作條的主題。

<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" 

進一步研究

我通過實驗和閱讀以下文章瞭解了這一點。