1

Je veux soutenir différents thèmes dans mon application Android. Les thèmes ne doivent différer que dans deux couleurs. Donc, il y a ces couleurs pour chaque thème:Changer uniquement la couleur lors du changement de thème

  • Couleur primaire
  • Couleur secondaire

Ce que je veux, qu'il ya un grand thème par défaut, qui a aussi des enfants comme des styles bouton et, comme ceci (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> 

Mais maintenant je veux aussi changer les thèmes pour différentes couleurs. Par conséquent, j'ai créé une ressource dans le fichier attrs.xml:

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

Alors maintenant, je peux utiliser cet attribut dans mon styles.xml d'en haut comme ceci:

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

Mais comment puis-je créer mes thèmes de couleur? Je sais que je dois faire quelque chose comme ceci:

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

Mais où? Et quel thème hérite de quoi? Si j'ai maintenant quelque chose comme:

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

Je ne peux pas préciser dans AndroidManifest.xml le thème comme celui-ci:

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

Étant donné que les ressources indiquées seraient manquants. Sinon, je ne peux pas non plus à ceci:

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

parce BlueTheme n'a pas d'enfant qui est appelé « NoActionBar ». Je sais que c'est déroutant, je suis assez confus moi-même. Comment puis-je résoudre ce problème? Merci d'avance.

Répondre

1

Vous devez spécifier les attributs personnalisés dans le thème parent:

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

Puis chaque enfant de DefaultTheme aurait accès à vos attributs personnalisés et peuvent également remplacer ceux-ci.

Si vous voulez combiner NoActionBar et BlueTheme, alors vous devez sous-classe NoActionBar thème:

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