1

Ich möchte verschiedene Themen in meiner Android-Anwendung unterstützen. Die Themen sollten sich nur in zwei Farben unterscheiden. So gibt es diese Farben für jedes Thema:Ändern Sie nur Farbe beim Ändern Thema

  • Primärfarbe
  • Sekundärfarbe

Was ich will, ist, dass es ein großes Standardthema ist, dass auch Kinder wie Button Stile et hat, so (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> 

Aber jetzt möchte ich auch Themen für verschiedene Farben ändern. Deshalb habe ich eine Ressource in der attrs.xml Datei erstellt:

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

So, jetzt kann ich dieses Attribut in meinem styles.xml von oben wie folgt verwenden:

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

Aber wie erstelle ich meine farbigen Themen? Ich weiß, ich brauche so etwas wie dies zu tun:

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

Aber wo? Und welches Thema erbt von welchem? Wenn ich jetzt so etwas wie haben:

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

kann ich nicht in AndroidManifest.xml das Thema wie folgt angeben:

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

Da die angegebenen Ressourcen fehlen würde. Ansonsten auch ich kann das nicht:

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

weil BlueTheme kein Kind hat, die „NoActionBar“ genannt wird.

Ich weiß, das ist verwirrend, ich bin selbst ziemlich verwirrt. Wie kann ich das lösen? Vielen Dank im Voraus.

Antwort

1

Sie müssen die benutzerdefinierten Attribute in dem übergeordneten Thema angeben:

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

dann jede Kinder DefaultTheme würde Zugriff auf Ihre benutzerdefinierte Attribute haben und auch solche, außer Kraft setzen können.

Wenn Sie NoActionBar und BlueTheme kombinieren möchten, dann haben Sie NoActionBar Thema Unterklasse:

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