Zunächst einmal diese Frage fragt eine sehr ähnliche Frage. Meine Frage hat jedoch einen subtilen Unterschied.
Ich möchte wissen, ob es möglich ist, das colorPrimary
Attribut eines Themas programmgesteuert in eine beliebige Farbe zu ändern .
So haben wir zum Beispiel:
<style name="AppTheme" parent="android:Theme.Material.Light">
<item name="android:colorPrimary">#ff0000</item>
<item name="android:colorAccent">#ff0000</item>
</style>
Zur Laufzeit entscheidet der Benutzer, dass er #ccffff
als Primärfarbe verwenden möchte . Natürlich kann ich auf keinen Fall Themen für alle möglichen Farben erstellen.
Es macht mir nichts aus, wenn ich hackige Dinge tun muss, wie mich auf die privaten Interna von Android zu verlassen, solange es mit dem öffentlichen SDK funktioniert.
Mein Ziel ist es schließlich , die haben ActionBar
und alle Widgets wie eine CheckBox
dieser Primärfarbe zu verwenden.
android
android-5.0-lollipop
Nhaarman
quelle
quelle
Antworten:
Themen sind unveränderlich, können Sie nicht.
quelle
Ich habe die Kommentare zur Kontakt-App gelesen und wie sie für jeden Kontakt ein Thema verwendet.
Wahrscheinlich hat die Kontakt-App einige vordefinierte Themen (für jede Materialprimärfarbe von hier: http://www.google.com/design/spec/style/color.html ).
Sie können ein Thema vor der setContentView-Methode in der onCreate-Methode anwenden.
Dann kann die Kontakt-App jedem Benutzer zufällig ein Thema zuweisen.
Diese Methode ist:
Diese Methode hat jedoch ein Problem, z. B. kann sie die Farbe der Symbolleiste, die Farbe des Bildlaufeffekts, die Farbe der Welligkeit usw. ändern, aber die Farbe der Statusleiste und der Navigationsleiste kann nicht geändert werden (wenn Sie sie auch ändern möchten).
Um dieses Problem zu lösen, können Sie die Methode vor und verwenden:
Diese beiden Methoden ändern die Farbe der Navigations- und Statusleiste. Denken Sie daran, wenn Sie Ihre Navigationsleiste durchscheinend einstellen, können Sie ihre Farbe nicht ändern.
Dies sollte der endgültige Code sein:
Sie können einen Schalter verwenden und eine Zufallszahl generieren, um zufällige Themen zu verwenden, oder wie in der Kontakt-App ist jedem Kontakt wahrscheinlich eine vordefinierte Nummer zugeordnet.
Ein Beispiel für ein Thema:
Entschuldigung für mein Englisch.
quelle
Mit Theme.applyStyle können Sie Ihr Thema zur Laufzeit ändern, indem Sie einen anderen Stil darauf anwenden.
Angenommen, Sie haben diese Stildefinitionen:
Jetzt können Sie Ihr Thema zur Laufzeit wie folgt patchen:
Die Methode
applyStyle
muss aufgerufen werden, bevor das Layout aufgeblasen wird! Wenn Sie die Ansicht nicht manuell laden, sollten Sie dem Thema Stile zuweisen, bevor SiesetContentView
Ihre Aktivität aufrufen .Dies kann natürlich nicht verwendet werden, um eine beliebige Farbe anzugeben, dh eine von 16 Millionen (256 3 ) Farben. Wenn Sie jedoch ein kleines Programm schreiben, das die Stildefinitionen und den Java-Code für Sie generiert, sollte so etwas wie eines von 512 (8 3 ) möglich sein.
Was dies interessant macht, ist, dass Sie verschiedene Stilüberlagerungen für verschiedene Aspekte Ihres Themas verwenden können. Fügen Sie
colorAccent
zum Beispiel einfach einige Overlay-Definitionen hinzu . Jetzt können Sie verschiedene Werte für Primärfarbe und Akzentfarbe fast willkürlich kombinieren .Sie sollten sicherstellen, dass Ihre Overlay-Designdefinitionen nicht versehentlich eine Reihe von Stildefinitionen von einer übergeordneten Stildefinition erben. Beispielsweise
AppTheme.OverlayRed
erbt ein Stil, der implizit aufgerufen wird, alle in definierten Stile,AppTheme
und alle diese Definitionen werden auch angewendet, wenn Sie das Masterthema patchen. Vermeiden Sie also entweder Punkte in den Namen der Overlay-Themen oder verwenden Sie so etwas wieOverlay.Red
und definieren Sie esOverlay
als leeren Stil.quelle
applyStyle
bevor SiesetContentView
Ihre Aktivität anrufen, und es sollte funktionieren.Ich habe eine Lösung erstellt, um beliebige Farbthemen zu erstellen. Vielleicht kann dies für jemanden nützlich sein. API 9+
1. Erstellen Sie zuerst " res / values-v9 / " und legen Sie dort die folgende Datei ab: styles.xml und der reguläre Ordner "res / values" werden für Ihre Stile verwendet.
2. Fügen Sie diesen Code in Ihre Datei res / values / styles.xml ein:
3. in AndroidManifest:
4. Erstellen Sie eine neue Klasse mit dem Namen "ThemeColors.java".
5. Hauptaktivität:
Um die Farbe zu ändern, ersetzen Sie einfach Random durch Ihr RGB. Ich hoffe, dies hilft.
Es gibt ein vollständiges Beispiel: ColorTest.zip
quelle
context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));
Sie mir eine Erklärung oder einen Link geben, um dieses Thema weiterzuverfolgen?Ich habe den Dahnark-Code verwendet, muss aber auch den ToolBar-Hintergrund ändern:
quelle
Sie können die Farbe von colorPrimary nicht ändern, aber Sie können das Thema Ihrer Anwendung ändern, indem Sie einen neuen Stil mit einer anderen colorPrimary-Farbe hinzufügen
und innerhalb des Aktivitätsset-Themas
quelle
von einer Aktivität, die Sie ausführen können:
quelle
BENUTZEN SIE EINE WERKZEUGLEISTE
Sie können eine benutzerdefinierte Symbolleistenelementfarbe dynamisch festlegen, indem Sie eine benutzerdefinierte Symbolleistenklasse erstellen:
Beziehen Sie sich dann in Ihrer Layoutdatei darauf. Jetzt können Sie mit eine benutzerdefinierte Farbe festlegen
Quellen:
Die Informationen dazu finden Sie hier: So ändern Sie dynamisch die Farbe der Android-Symbolleistensymbole
und dann habe ich es bearbeitet, verbessert und hier gepostet: GitHub: AndroidDynamicToolbarItemColor
quelle
Folgendes können Sie tun:
Schreiben Sie eine Datei in einen zeichnbaren Ordner und nennen Sie sie background.xml
Stellen Sie dann Ihr Layout ein (oder was auch immer der Fall ist)
android:background="@drawable/background"
Beim Festlegen Ihres Themas würde diese Farbe dieselbe darstellen.
quelle