Programmgesteuert ändern Sie den Wert einer Farbe Ressource, gewonnen aus der API-Antwort
Sagen wir mal, auf mein API-Aufruf habe ich einen parameter, der heißt color
. Ist es möglich zu Bearbeiten oder ändern Sie einen existierenden R.colors.color
zuordnen, um die Farbe aus der API-Ergebnis?
Als Beispiel:
Ich einen Anruf an meine-API und es gibt green
, jetzt will ich laden Sie meine app mit ich.e (grün Toolbar
-, grün - TextView
Farbe, etc.), ist das möglich?
Mein Erster Gedanke war:
Erstellen Sie ein Element auf colors.xml
genannt demo
dann weisen Sie eine Standard-Farbe, dann verwenden Sie diese demo
Farbe, wo immer ich will ( Button
, TextView
usw.) Dann dachte ich, es könnte möglich sein, diesen Wert zu ändern programmgesteuert mit dem Ergebnis von der API, so dass ich nicht brauchen zu erstellen eine SharedPreferences
oder sowas und für die Vermeidung von mehr code.
Als @Y. S. sagte zu mir
Leider, haben Sie, um die Farbe von text oder anzeigen manuell überall ... 🙁
Ich möchte, wenn es andere Weg, es zu tun, da ich nicht weiß, wie viele Activities
mein Projekt enthalten, so dass, wenn gibt es andere Wege, es zu tun ich bin froh zu hören, andere Vermutungen.
BEARBEITEN
Ich versuche die @Jared Rummler Antwort und vielleicht mache ich etwas falsch... ich habe eine einfache Json
und ich legte meine Anlagen, die ich analysieren die Json
und ich legte es auf eine GlobalConstant
dann machte ich eine "einfache app".
Zuerst habe ich eine TextView
und ein Button
mit den "your_special_color", und die Rückkehr von es ich die GlobalConstant int
wie folgt :
case "your_special_color":
return GlobalConstant.color;
Dann, was ich versucht habe, ist mein Erster Activity
hat 1 TextView
und 1 Button
wie ich schon sagte, bevor, und Sie haben die Farbe "your_special_color", dass ich nicht wollen, es zu ändern, ABER ich habe eine Intent
auf meine Button
zu öffnen, die anderen Activity
enthält das gleiche, aber mit der GlobalConstant.color
und es ändert sich nicht.
Ich habe es versucht, dies zu tun (meine zweite Tätigkeit):
public class Main2Activity extends AppCompatActivity {
private Res res;
@Override public Resources getResources() {
if (res == null) {
res = new Res(super.getResources());
}
return res;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
Hab ich was verpasst?
Oh.. ich dachte, es heraus, dass ich denke, tut dies auf meine MainActivity2
?
Button btn = (Button)findViewById(R.id.button2);
btn.setBackgroundColor(res.getColor(R.color.your_special_color));
Hey! Hast du endlich dieses Problem beheben? Ich stehe vor einem ähnlichen Problem!
Folgen Sie den Jared Lösung, es funktioniert denke ich mal
Check-out Cyanea dynamisch ändern, primär-und Akzent-Farben: github.com/jaredrummler/Cyanea
InformationsquelleAutor Skizo-ozᴉʞS | 2015-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie einen Blick auf die Zugriff Auf Ressourcen Dokument, was es sagt, ist, dass ...
Darüber hinaus
Was dies sagt, im wesentlichen, ist, dass so ziemlich alles als Ressource in der
res/
Verzeichnis zusammengestellt und referenziert als eine unveränderliche Konstante. Es ist aus diesem Grund, dass die Werte der resource-Elemente können nicht geändert werden programmgesteuert/zur Laufzeit, weil Sie zusammengestellt. Im Gegensatz zu lokalen/globalen Variablen &SharedPreferences
-, Ressourcen-Elemente sind vertreten im Programm-Speicher als Feste, unveränderliche Objekte. Gehalten werden Sie in einem speziellen nur-lese-region der Programm-Speicher. In diesem Zusammenhang siehe auch Changing value of R. Zeichenfolge Programmgesteuert.Was Sie kann tun ist, um zu vermeiden, mit dem gleichen code an tausend stellen im Projekt, erstellen Sie eine gemeinsame Funktion, ändert sich der Wert der Farbe in der
SharedPreferences
und verwenden Sie diese Methode überall. Ich bin sicher, Sie wussten das schon, natürlich.Reduzieren die Menge an code, den Sie brauchen, um Sie dem Projekt hinzuzufügen, gibt es eine alternative. Ich habe bisher die Kalligraphie-Bibliothek, die mir erlaubte, zu beheben, die schriftart, Stil & Farbe im gesamten app. Dies ist vielleicht gut für Sie, check it out ...
Das ist richtig, das kannst du nicht tun. Aber Sie müssen nicht erstellen die Farbe wiederholt, Sie können es schaffen, in eine gemeinsame Basisklasse, und halten Sie den Wert als Globale variable, die Sie überall nutzen können. Leider, Sie WERDEN die Farbe von text oder anzeigen manuell überall ... 🙁
Ja das was ich meinte... ich kann speichern Sie den Wert auf sharedpref dann erstellen Sie eine globalclaas zu erklären, die Farbe, aber dann... Alle setcolor hintergrund erforderlich sind, naja... ich werde versuchen, eine andere Lösung finden irgendwo, wenn ich nicht finden, ich werde tun, was Sie sagen, @Y. S.
Ich habe gerade an etwas gedacht, was ... siehe edit ... könnte nützlich sein ...
Vielen Dank und viel Glück 🙂 .... Sprechen Sie bald ...
InformationsquelleAutor Y.S.
Können Sie eine Klasse erstellen, die erweitert
Resources
und überschreiben Sie die MethodengetColor(int)
undgetColor(int, Theme)
.Beispiel:
colors.xml
Res.java
BaseActivity.java
Dies ist der Ansatz, den ich verwendet habe in einer meiner apps, Root Check. Wenn Sie überschreiben
getResources
in Ihre Aktivitäten und die wichtigsten application-Klasse können Sie das Thema ändern programmgesteuert (obwohl Themen sind unveränderlich). Wenn Sie möchten, laden Sie die app und sehen Sie, wie Sie können die primär -, Akzent-und Hintergrundfarben aus den Einstellungen.Ich werde nicht verfügbar für weitere 6 Stunden. Fühlen Sie sich frei, mich zu mailen und ich werde Ihnen helfen. [email protected]
Sorry Jungs, aber das ist jetzt
DEPECRATED
Ich schrieb eine Bibliothek, die dynamisch ändert sich die hintergrund -, primär-und Akzent-Farben, die von einer app. Die Bibliothek ist derzeit nicht geöffnet, aber hoffentlich kann ich teilen Sie es bald. Der obige code funktioniert nicht auf Android 6.0+, da viele Veränderungen vorgenommen wurden, zu Ressourcen. Auch, dass ich nicht mehr alleine die Root Check app verknüpft in der Antwort.
Check-out Cyanea für dynamische themes: github.com/jaredrummler/Cyanea
InformationsquelleAutor Jared Rummler
Können Sie nicht ändern, eine app, die Ressourcen, Sie sind alle Konstanten. Stattdessen können Sie Ihre Farbe in SharedPrefences und die Farbe von dort.
Sehen Wie zu verwenden SharedPreferences in Android speichern, abrufen und Bearbeiten Sie die Werte.
Wenn Ihre app bereits eine R. Farbe.grün definiert und Sie wollen einfach nur Zugang it auf Basis von was-API zurückgegeben, die Sie verwenden:
SharedPreferences
und ich denke, Sie hat mich nicht erwischt, ich meinte, dass Sie können erstellen Sie eine Datei namenscolors.xml
Recht? und dann erstellen Sie die Elemente mit Farben mit HEX, dann würde ich gerne wissen, ob ich kann moddify diesen Wert programmgesteuert um zuerst die demo Farbe und dann die eigentliche Farbe.Sie können nicht ändern, den Inhalt von colors.xml bei Laufzeit, anstatt Sie halten können alle möglichen Farben, und verwenden Sie getIdentifier, um die Farbe kehrte von API. Sie können die gewählte Farbe in SharedPref und rufen Sie es später in der nächsten session bis API-Aufruf beendet
Ya, aber wie setzt man die Textfarbe einer textView oder button? wenn ich 10 Textviews und ich möchte Sie auf den grünen text, ich die setText(java) für jede und asigning der Wert von SharedPreferences?...
Yep, das ist der einzige Weg. Und außerdem, ändern von Ressourcen kann später dazu führen, dass alle Arten von Verwirrung in Ihrer app
InformationsquelleAutor Sourabh
R
Klasse soll nicht bearbeitet werden. Es enthält lediglich Verweise auf Ihre Ressourcen.Müssen Sie die Einstellung manuell. Allerdings reduzieren die Belastung der Einstellung manuell können Sie versuchen, um spezielle Bibliotheken für die Präferenz zu speichern, zum Beispiel:
(vollständige Liste der ähnlichen Bibliotheken https://android-arsenal.com/tag/75)
Auch, möchten Sie vielleicht denken über eine andere Möglichkeit der Anwendung von Formatvorlagen und übergeben die Parameter - Ansicht, die Sie möchten, fügen Sie einige weitere Parameter wie Höhe, Breite usw. Für diesen Zweck können Sie festlegen, benutzerdefinierte Attribut in themes.xml/styles.xml:
dann definieren Sie Stile:
dann verwenden Sie diese Farbe in Ihre xml wie diese:
wechseln und zwischen
GreenActivity
undRedActivity
Stile inActivity.onCreate
:Mit dem obigen Ansatz, können Sie einfach konfigurieren Sie Ihre Stile in xml-und es sollte weniger code und einfacher zu gestalten in Zukunft. (Werden Sie noch brauchen, um eine variable in Präferenz zu speichern, ob Sie grün oder rot, Stil)
Einen anderen Weg, wenn Sie wollen, um zu zeigen demos der app mit unterschiedlichen Farben ist die Verwendung von build-Varianten /Aromen für das laden Sie Ihre app mit verschiedenen Farben und Stilen (es ist für die build-Zeit, nicht Spielzeit):
app/src/main/res/colors.xml
app/src/buildVariant/res/colors.xml
Jetzt können Sie schnell Umschalten zwischen "main" und "buildVariant" in der Build-Varianten-Menü und starten Sie Ihre app mit verschiedenen "demo" Farben. Die gleiche Weise können Sie anpassen, viele andere Attribute.
Suche nach "Build Variants" - hier http://developer.android.com/tools/building/configuring-gradle.html
build-Varianten / Aromen sind nicht für den Wert ändern programmgesteuert - Sie ermöglichen Ihnen das erstellen und führen Sie Ihre app mit verschiedenen Stilrichtungen/Farben/Ressourcen. Es scheint, dass ich verpasst "programmgesteuert" Teil von Ihr Fragen 🙂 ich update meine Antwort ein wenig. Würde es helfen, wenn könnten Sie wirklichen nutzen der Funktionalität, die Sie versuchen, zu implementieren. Vielleicht gibt es einen besseren Weg, es zu tun.
Naja ich will einfach nur speichern Sie die Farbe, nicht der Stil.
Ich sehe. Hinzugefügt ein paar von Präferenz-Bibliotheken, so dass Sie vielleicht erwägen Sie, Sie erlauben zu binden, Vorlieben - dies könnte helfen, mit Verringerung der code.
Das ist genau das was ich gesucht habe!!! Sie sind ein Genie! Es gibt Ihnen die Möglichkeit der Verwendung von Farben im Layout und im code als auch. Hier ist ein gutes Beispiel, um es im code verwenden: stackoverflow.com/questions/17277618/...
InformationsquelleAutor GregoryK
speichern hex-Farb-codes in die sharedpreferences und verwenden Sie dann parsecolor Funktion speichern Sie Ihre alle hexcodes der Farben in Sitzungen als string und Wann immer Sie wollen, ändern Sie Farbe besonders button ,textview..nur ermittelt werden, dass die Farbe code aus der Sitzung und verwenden Sie es als
für die ex.
session.setString("white","#FFFFFF");
String colorname=session.getString("white");yourtextview.setBackgroundColor(Color.parseColor(colorname);
InformationsquelleAutor Mayuresh Gawande