Angenommen, ich habe bei meinem API-Aufruf einen Parameter, der aufgerufen wird color
. Ist es möglich, eine vorhandene zu bearbeiten oder zu ändern R.colors.color
, um die Farbe aus dem API-Ergebnis zuzuweisen?
Als Beispiel:
Ich rufe meine API auf und sie kehrt zurück green
. Jetzt möchte ich meine App mit dh (grün Toolbar
, grüne TextView
Farbe usw.) laden. Ist das möglich?
Mein erster Gedanke war:
Erstellen Sie auf ein Element colors.xml
namens demo
dann eine Standardfarbe zuweisen, dann diese verwenden demo
Farbe wohin ich will ( Button
, TextView
usw.) Dann dachte ich , könnte es möglich sein , diesen Wert zu ändern programmatisch mit dem Ergebnis aus der API so dass ich nicht brauchen würde , Erstellen Sie ein SharedPreferences
oder ähnliches und vermeiden Sie mehr Code.
Wie @YS zu mir sagte
Leider müssen Sie die Farbe des Textes oder der Ansicht überall manuell einstellen ... :(
Ich würde gerne wissen, ob es einen anderen Weg gibt, da ich nicht weiß, wie viele Activities
mein Projekt enthalten wird. Wenn es also einen anderen Weg gibt, bin ich froh, andere Vermutungen zu hören.
BEARBEITEN
Ich versuche die @ Jared Rummler Antwort und vielleicht mache ich etwas falsch ... Ich habe eine einfache erstellt Json
und ich habe meine Assets aufgelegt, ich analysiere die Json
und ich habe sie auf eine gelegt, GlobalConstant
dann habe ich eine "einfache App" gemacht.
Zuallererst habe ich ein TextView
und ein, Button
das die "your_special_color" enthält, und die Rückgabe davon habe ich GlobalConstant int
wie folgt ausgedrückt :
case "your_special_color":
return GlobalConstant.color;
Dann habe ich versucht, meine erste Activity
hat 1 TextView
und 1, Button
wie ich bereits sagte, und sie haben die Farbe "your_special_color", die ich nicht ändern möchte, ABER ich habe eine Intent
auf meiner Button
, um die andere zu öffnen Activity
, die die gleiche enthält, aber mit der GlobalConstant.color
und es ändert sich nicht.
Ich habe es dabei versucht (meine zweite Aktivität):
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);
}
Habe ich etwas verpasst?
Oh ... ich habe es herausgefunden, ich denke, macht das auf meinem MainActivity2
?
Button btn = (Button)findViewById(R.id.button2);
btn.setBackgroundColor(res.getColor(R.color.your_special_color));
quelle
Antworten:
Wenn Sie sich das Dokument Zugriff auf Ressourcen ansehen , heißt es, dass ...
Außerdem,
Dies bedeutet im Wesentlichen, dass so ziemlich alles, was als Ressource im
res/
Verzeichnis gespeichert ist, kompiliert und als unveränderliche Konstante referenziert wird. Aus diesem Grund können die Werte von Ressourcenelementen nicht programmgesteuert / zur Laufzeit geändert werden, da sie kompiliert werden . Im Gegensatz zu lokalen / globalen Variablen &SharedPreferences
werden Ressourcenelemente im Programmspeicher als feste, unveränderliche Objekte dargestellt. Sie befinden sich in einem speziellen schreibgeschützten Bereich des Programmspeichers. Siehe hierzu auch Ändern des Werts von R.String Programmatisch .Was Sie können tun , ist, zu vermeiden , an tausend Stellen mit dem gleichen Code in Ihrem Projekt, erstellen Sie eine gemeinsame Funktion, die den Wert der Farbe in der ändert
SharedPreferences
und diese Methode überall benutzen. Ich bin mir sicher, dass Sie das schon gewusst haben.Um die Menge an Code zu reduzieren, die Sie dem Projekt hinzufügen müssen, gibt es eine Alternative. Ich habe zuvor die Kalligraphiebibliothek verwendet, mit der ich den Schriftstil und die Farbe in der gesamten App korrigieren konnte. Dies kann für Sie von Nutzen sein, probieren Sie es aus ...
quelle
Sie können eine Klasse erstellen, die
Resources
die MethodengetColor(int)
und erweitert und überschreibtgetColor(int, Theme)
.Beispiel:
Farben.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="your_special_color">#FF0099CC</color> </resources>
Res.java
public class Res extends Resources { public Res(Resources original) { super(original.getAssets(), original.getDisplayMetrics(), original.getConfiguration()); } @Override public int getColor(int id) throws NotFoundException { return getColor(id, null); } @Override public int getColor(int id, Theme theme) throws NotFoundException { switch (getResourceEntryName(id)) { case "your_special_color": // You can change the return value to an instance field that loads from SharedPreferences. return Color.RED; // used as an example. Change as needed. default: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return super.getColor(id, theme); } return super.getColor(id); } } }
BaseActivity.java
public class BaseActivity extends AppCompatActivity { ... private Res res; @Override public Resources getResources() { if (res == null) { res = new Res(super.getResources()); } return res; } ... }
Dies ist der Ansatz, den ich in einer meiner Apps, Root Check, verwendet habe . Wenn Sie
getResources
Ihre Aktivitäten und die Hauptanwendungsklasse überschreiben , können Sie das Thema programmgesteuert ändern (obwohl Themen unveränderlich sind). Wenn Sie möchten, laden Sie die App herunter und sehen Sie, wie Sie die Primär-, Akzent- und Hintergrundfarben in den Einstellungen festlegen können.quelle
DEPECRATED
R
Klasse soll nicht bearbeitet werden. Es enthält lediglich Verweise auf Ihre Ressourcen.Sie müssen es manuell einstellen. Um die manuelle Einstellung zu verringern, können Sie versuchen, spezielle Bibliotheken zum Speichern von Einstellungen zu verwenden, z. B.:
(vollständige Liste ähnlicher Bibliotheken https://android-arsenal.com/tag/75 )
Möglicherweise möchten Sie auch über eine andere Methode zum Anwenden von Stilen und Übergeben von Parametern nachdenken. Denken Sie daran, dass Sie einige andere Parameter wie Höhe, Breite usw. hinzufügen möchten. Zu diesem Zweck können Sie ein benutzerdefiniertes Attribut in der Datei theme.xml / styles.xml definieren:
<attr name="demoColor" format="reference|color" />
Definieren Sie dann Stile:
<style name="BaseActivity"> </style> <style name="GreenActivity" parent="@style/BaseActivity"> <item name="demoColor">#00cd00</item> </style> <style name="RedActivity" parent="@style/BaseActivity"> <item name="demoColor">#ff0000</item> </style>
Verwenden Sie dann diese Farbe in Ihrer XML wie folgt:
... android:background="?demoColor" ...
und wechseln Sie zwischen
GreenActivity
undRedActivity
Stile inActivity.onCreate
:setTheme(isGreenStyle() ? R.style.GreenActivity : R.style.RedActivity) setContentView(...)
Mit dem oben beschriebenen Ansatz können Sie Ihre Stile problemlos in XML konfigurieren. Es sollte weniger Code enthalten und in Zukunft einfacher umzugestalten sein. (Sie müssen immer noch eine Variable bevorzugen, um zu speichern, ob Sie einen grünen oder einen roten Stil haben.)
Wenn Sie Demos Ihrer App mit verschiedenen Farben anzeigen möchten, können Sie auch Build-Varianten / -Varianten verwenden, um Ihre App mit verschiedenen Farben und Stilen zu laden (dies gilt für die Build-Zeit - nicht für die Laufzeit):
app / src / main / res / colours.xml
<resources> <color name="demoColor">#00cd00</color> </resources>
app / src / buildVariant / res / colours.xml
<resources> <color name="demoColor">#ff0000</color> </resources>
Jetzt können Sie im Menü "Varianten erstellen" schnell zwischen "main" und "buildVariant" wechseln und Ihre App mit verschiedenen "Demofarben" starten. Auf die gleiche Weise können Sie viele andere Attribute anpassen.
Suchen Sie hier nach "Build Variants" http://developer.android.com/tools/building/configuring-gradle.html
quelle
Sie können die Ressourcen einer App nicht ändern, sie sind alle Konstanten. Stattdessen können Sie Ihre Farbe in SharedPrefences speichern und die Farbe von dort aus verwenden.
Siehe Verwenden von SharedPreferences in Android zum Speichern, Abrufen und Bearbeiten von Werten .
Wenn in Ihrer App bereits ein R.color.green definiert ist und Sie nur auf der Grundlage der von Ihnen verwendeten API darauf zugreifen möchten:
int resourceID = getResources().getIdentifier("green", "color", getPackageName());
quelle
SharedPreferences
und ich denke, Sie haben mich nicht verstanden. Ich meinte, Sie können eine Datei mit dem Namencolors.xml
richtig erstellen . und dann darauf Elemente mit Farben mit HEX erstellen, dann würde ich gerne wissen, ob ich diesen Wert programmgesteuert ändern kann, um zuerst die Demofarbe und dann die echte Farbe zu setzen.Speichern Sie hexadezimale Farbcodes in gemeinsam genutzten Einstellungen und verwenden Sie dann die Parsecolor-Funktion. Speichern Sie alle hexadezimalen Farbcodes in Sitzungen als Zeichenfolge. Wenn Sie die Farbe der jeweiligen Schaltfläche, der Textansicht ändern möchten, rufen Sie diesen Farbcode einfach aus der Sitzung ab und verwenden Sie ihn wie
z.
session.setString("white","#FFFFFF"); String colorname=session.getString("white");yourtextview.setBackgroundColor(Color.parseColor(colorname);
quelle