1

我想在我的android應用程序中支持不同的主題。 主題應該只有兩種顏色。因此,有這些顏色對於每個主題:僅在更改主題時更改顏色

  • 原色
  • 輔色

我想要的是,有一個大的默認主題,也有孩子們喜歡的按鈕樣式等,像這樣(styles.xml):

<style name="DefaultTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="homeAsUpIndicator">@drawable/my_stackoverflow_arrow</item> 
    [...] 
</style> 

<style name="DefaultTheme.NoActionBar"> 
    <!-- hide action bar and title --> 
    <item name="windowActionBar">false</item> 
    <item name="windowNoTitle">true</item> 
</style> 

<style name="DefaultTheme.Button"> 
    <item name="android:textAllCaps">true</item> 
    <item name="android:textStyle">bold</item> 
    [...] 
</style> 

但現在我也想改變不同顏色的主題。因此,我在attrs.xml文件創建的資源:

<resources> 
    <attr name="ThemeColorPrimary" format="reference" /> 
    <attr name="ThemeColorSecondary" format="reference" /> 
</resources> 

所以,現在我可以在我的styles.xml從上面使用這個屬性是這樣的:

<style name="DefaultTheme.Button"> 
    <item name="android:textAllCaps">true</item> 
    <item name="android:textStyle">bold</item> 
    <item name="android:textColor">?attr/ThemeColorPrimary</item> 
    [...] 
</style> 

但是我怎麼創造我的顏色主題?我知道我需要做這樣的事情:

<item name="ThemeColorPrimary">@color/ThemeBluePrimary</item> 

但是在哪裏?哪個主題從哪個繼承?如果我現在有這樣的事情:

<style name="BlueTheme" parent="DefaultTheme"> 
    <item name="ThemeColorPrimary">@color/ThemeBluePrimary</item> 
    <item name="ThemeColorSecondary">@color/ThemeBlueSecondary</item> 
</style> 

<style name="GreyTheme" parent="DefaultTheme"> 
    <item name="ThemeColorPrimary">@color/ThemeGreyPrimary</item> 
    <item name="ThemeColorSecondary">@color/ThemeGreySecondary</item> 
</style> 

<style name="BlackTheme" parent="DefaultTheme"> 
    <item name="ThemeColorPrimary">@color/ThemeBlackPrimary</item> 
    <item name="ThemeColorSecondary">@color/ThemeBlackSecondary</item> 
</style> 

我不能AndroidManifest.xml主題類似這樣的規定:

<activity 
    android:name="StackOverflowActivity" 
    android:screenOrientation="portrait" 
    android:theme="@style/DefaultTheme.NoActionBar" /> 

,因爲指定的資源將丟失。否則我也不能這樣:

<activity 
    android:name="StackOverflowActivity" 
    android:screenOrientation="portrait" 
    android:theme="@style/BlueTheme.NoActionBar" /> 

因爲BlueTheme沒有被稱爲「NoActionBar」的Child。

我知道這很混亂,我很困惑自己。 我該如何解決這個問題? 預先感謝您。

回答

1

您必須指定父主題的自定義屬性:

<style name="DefaultTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="ThemeColorPrimary">@color/defaultPrimaryColor</item> 
    <item name="ThemeColorSecondary">@color/defaultSecondaryColor</item> 
</style> 

隨後的DefaultTheme每個兒童將有機會獲得您的自定義屬性,也可以覆蓋這些。

如果你想結合NoActionBarBlueTheme,那麼你必須繼承NoActionBar主題:

<style name="BlueNoActionBarTheme" parent="DefaultTheme.NoActionBar"> 
    <item name="ThemeColorPrimary">@color/ThemeBluePrimary</item> 
    <item name="ThemeColorSecondary">@color/ThemeBlueSecondary</item> 
</style>