Theme.AppCompat wird verwendet, um das globale Thema für die gesamte App festzulegen. ThemeOverlay.AppCompat wird verwendet, um dieses Thema für bestimmte Ansichten, insbesondere die Symbolleiste, zu überschreiben (oder zu "überlagern").
Schauen wir uns ein Beispiel an, warum dies notwendig ist.
App-Themen mit einer ActionBar
Die ActionBar wird normalerweise in einer App angezeigt. Ich kann die Farbe auswählen, indem ich den colorPrimary
Wert einstelle . Durch Ändern des Themas wird jedoch die Farbe des Texts in der Aktionsleiste geändert.
<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>
Da meine Primärfarbe dunkelblau ist, sollte ich wahrscheinlich eines der Themen verwenden, das eine helle Textfarbe in der Aktionsleiste verwendet, da der schwarze Text schwer zu lesen ist.
Ausblenden der Aktionsleiste und Verwenden einer Symbolleiste
Der Sinn der Verwendung von Theme.AppCompat anstelle von Theme.Material besteht darin, dass ältere Versionen von Android unser Materialdesign-Thema verwenden können. Das Problem ist, dass ältere Android-Versionen die ActionBar nicht unterstützen. In der Dokumentation wird daher empfohlen, die Aktionsleiste auszublenden und Ihrem Layout eine Symbolleiste hinzuzufügen. Um die ActionBar auszublenden, müssen wir eines der NoActionBar
Themen verwenden. Die folgenden Bilder zeigen die Symbolleiste mit ausgeblendeter Aktionsleiste.
Aber was ist, wenn ich so etwas wie ein Lichtthema mit einer DarkActionBar möchte? Da ich NoActionBar verwenden muss, ist das keine Option.
Überschreiben des App-Themas
Hier kommt ThemeOverlay ins Spiel. Ich kann das Dark ActionBar-Thema in meinem Symbolleisten-XML-Layout angeben.
<android.support.v7.widget.Toolbar
...
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
Dies ermöglicht es uns schließlich, den gewünschten Effekt zu erzielen. Das Dark.ActionBar-Thema überlagert das Light-App-Thema für diesen besonderen Anlass.
- App-Thema:
Theme.AppCompat.Light.NoActionBar
- Symbolleisten-Thema:
ThemeOverlay.AppCompat.Dark.ActionBar
Wenn Sie möchten, dass das Popup-Menü hell ist, können Sie Folgendes hinzufügen:
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Weitere Studie
Ich habe dies durch Experimentieren und durch Lesen der folgenden Artikel gelernt.