Wann sollte man Theme.AppCompat vs ThemeOverlay.AppCompat verwenden?

113

Es gibt die folgenden Theme.AppCompat-Klassen:

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

und die folgenden ThemeOverlay.AppCompat-Klassen:

ThemeOverlay.AppCompat
ThemeOverlay.AppCompat.Light
ThemeOverlay.AppCompat.Dark
ThemeOverlay.AppCompat.ActionBar
ThemeOverlay.AppCompat.Dark.ActionBar

Warum sollte man zum Beispiel ThemeOverlay.AppCompat.light vs Theme.AppCompat.Light verwenden? Ich sehe, dass für ThemeOverlay viel weniger Attribute definiert sind - ich bin gespannt, was der beabsichtigte Anwendungsfall für ThemeOverlay ist.

Brendan Weinstein
quelle

Antworten:

71

Zu diesem Blog-Beitrag von Theme vs Style des Erstellers von AppCompat:

[ThemeOverlays] sind spezielle Themen, die die normalen Theme.Material-Themen überlagern und relevante Attribute überschreiben, um sie entweder hell / dunkel zu machen.

ThemeOverlay + ActionBar

Die scharfen Augen von Ihnen werden auch die ActionBar ThemeOverlay-Derivate gesehen haben:

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

Diese sollten nur mit der Aktionsleiste über das neue actionBarThemeAttribut verwendet oder direkt in Ihrer Symbolleiste festgelegt werden.

Das einzige , was diese zur Zeit nicht anders zu ihren Eltern ist , dass sie die Änderung colorControlNormalzu sein android:textColorPrimary, so einen beliebigen Text zu machen und Symbole undurchsichtig.

ianhanniballake
quelle
155

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

Geben Sie hier die Bildbeschreibung ein

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 NoActionBarThemen verwenden. Die folgenden Bilder zeigen die Symbolleiste mit ausgeblendeter Aktionsleiste.

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

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

Suragch
quelle
Wie mache ich die Statusleiste transparent, wenn ich Themeoverlay verwende?
gegobyte
Ich frage mich, wie ich das mit der neuen MaterialToolbar erreichen kann
David
@ David, ich arbeite jetzt hauptsächlich mit Flutter, daher habe ich mich nicht über neue Android-Entwicklungen informiert. Wenn Sie die Antwort finden, können Sie gerne hierher zurückkehren und einen Kommentar hinterlassen, meine Antwort bearbeiten oder Ihre eigene Antwort hinzufügen.
Suragch