Modifier par programmation la valeur d’une ressource couleur obtenue à partir de la réponse de l’API

Disons que sur mon appel API, j’ai un paramètre appelé color . Est-il possible d’éditer ou de modifier un R.colors.color existant pour atsortingbuer la couleur au résultat de l’API?

Par exemple:

Je fais un appel à mon API et il retourne au green , maintenant je veux charger mon application avec ( Toolbar verte, couleur TextView verte, etc.), est-ce possible?

Ma première pensée était:

Créez un élément sur colors.xml appelé demo puis assignez-lui une couleur par défaut, puis utilisez cette couleur de demo où bon vous semble ( Button , TextView , etc.). J’ai alors pensé qu’il serait possible de modifier cette valeur par programmation avec le résultat de l’API. donc je n’aurais pas besoin de créer une SharedPreferences ou quelque chose comme ça et d’éviter plus de code.

Comme @YS m’a dit

Malheureusement, vous devrez définir la couleur du texte ou afficher manuellement partout … 🙁

J’aimerais bien qu’il y ait un autre moyen de le faire, car je ne sais pas combien d’ Activities mon projet contiendra, alors s’il existe une autre façon de le faire, je suis heureux d’entendre d’autres suppositions.

MODIFIER

J’essaie la réponse de @Jared Rummler et peut-être que je fais quelque chose de mal … J’ai créé un Json simple et j’ai mis mes Assets sur le Json et je l’ai mis sur un GlobalConstant puis j’ai fait un “simple app “.

Tout d’abord, j’ai un TextView et un Button qui contient le “your_special_color”, et le retour de celui-ci j’ai mis le GlobalConstant int comme suit:

 case "your_special_color": return GlobalConstant.color; 

Alors ce que j’ai essayé, c’est que ma première Activity a 1 TextView et 1 Button comme je l’ai déjà dit et ils ont la couleur “your_special_color” que je ne veux pas changer, MAIS j’ai une Intent sur mon Button pour ouvrir l’autre Activity contient le même mais avec le GlobalConstant.color et il ne change pas.

Je l’ai essayé (ma deuxième activité):

 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); } 

Ai-je manqué quelque chose?

Oh, je l’ai compris, je pense que c’est ce que je fais sur ma MainActivity2 ?

  Button btn = (Button)findViewById(R.id.button2); btn.setBackgroundColor(res.getColor(R.color.your_special_color)); 

    Si vous regardez le document Accessing Resources , il est dit que …

    Une fois que vous fournissez une ressource dans votre application, vous pouvez l’appliquer en référençant son ID de ressource. Tous les ID de ressource sont définis dans la classe R votre projet, que l’outil aapt génère automatiquement.

    En outre,

    Lorsque votre application est compilée , aapt génère la classe R , qui contient les ID de ressource pour toutes les ressources de votre répertoire res/ . Pour chaque type de ressource, il existe une sous-classe R (par exemple, R.drawable pour toutes les ressources pouvant être dessinées) et pour chaque ressource de ce type, il existe un entier statique (par exemple, R.drawable.icon ). Cet entier est l’ID de ressource que vous pouvez utiliser pour récupérer votre ressource.

    En gros, cela signifie que pratiquement tout ce qui est contenu dans le répertoire res/ est compilé et référencé comme une constante inchangeable. C’est pour cette raison que les valeurs des éléments de ressource ne peuvent pas être modifiées par programme / à l’exécution, car elles sont compilées . Contrairement aux variables locales / globales & SharedPreferences , les éléments de ressource sont représentés dans la mémoire programme sous la forme d’objects fixes et non SharedPreferences . Ils sont stockés dans une région spéciale en lecture seule de la mémoire programme. À cet égard, voir également Modification de la valeur de R.Ssortingng par programme .

    Ce que vous pouvez faire, pour éviter d’utiliser le même code à mille endroits dans votre projet, créez une fonction commune qui modifie la valeur de la couleur dans les SharedPreferences et utilisez cette méthode partout. Je suis sûr que vous le saviez déjà, bien sûr.

    Pour réduire la quantité de code que vous devez append au projet, il existe une alternative. J’ai déjà utilisé la bibliothèque de calligraphie qui m’a permis de corriger le style et la couleur de la police dans toute l’application. Cela peut vous être utile, regardez-le …

    Vous pouvez créer une classe qui étend les Resources et remplace les méthodes getColor(int) et getColor(int, Theme) .

    Exemple:

    colors.xml

       #FF0099CC  

    Res.java

     public class Res extends Resources { public Res(Resources original) { super(original.getAssets(), original.getDisplayMesortingcs(), 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; } ... } 

    C’est l’approche que j’ai utilisée dans l’une de mes applications, Root Check . Si vous remplacez getResources dans vos activités et votre classe d’application principale, vous pouvez modifier le thème par programmation (même si les thèmes sont immuables). Si vous le souhaitez, téléchargez l’application et voyez comment définir les couleurs primaires, d’accentuation et d’arrière-plan à partir des préférences.

    R classe R n’est pas censée être modifiée. Il ne contient que des références à vos ressources.

    Vous devrez le définir manuellement. Cependant, pour réduire la charge de la configuration manuelle, vous pouvez essayer d’utiliser des bibliothèques spéciales pour sauvegarder vos préférences, par exemple:

    (liste complète des bibliothèques similaires https://android-arsenal.com/tag/75 )


    En outre, vous voudrez peut-être réfléchir à une autre manière d’appliquer des styles et de passer des parameters: considérez que vous souhaitez append d’autres parameters tels que height, width, etc. Vous pouvez définir un atsortingbut personnalisé dans themes.xml / styles.xml:

      

    puis définissez les styles:

        

    alors utilisez cette couleur dans votre xml comme ceci:

     ... android:background="?demoColor" ... 

    et basculer entre les styles GreenActivity et RedActivity dans Activity.onCreate :

     setTheme(isGreenStyle() ? R.style.GreenActivity : R.style.RedActivity) setContentView(...) 

    Avec l’approche ci-dessus, vous serez en mesure de configurer facilement vos styles en XML et cela devrait être moins de code et plus facile à restructurer à l’avenir. (Vous aurez toujours besoin d’une variable pour enregistrer si vous avez un style vert ou rouge)


    Une autre façon, si vous souhaitez afficher des démos de votre application avec des couleurs différentes, consiste à utiliser des variantes / saveurs de génération pour charger votre application avec des couleurs et des styles différents (c’est pour le temps de construction – pas pour l’exécution):

    app / src / main / res / couleurs.xml

      #00cd00  

    app / src / buildVariant / res / colors.xml

      #ff0000  

    Maintenant, vous pouvez rapidement basculer entre “main” et “buildVariant” dans le menu Variantes de construction et lancer votre application avec différentes couleurs “de démonstration”. De la même manière, vous pouvez personnaliser de nombreux autres atsortingbuts.

    Recherchez “Variantes de construction” ici http://developer.android.com/tools/building/configuring-gradle.html

    Vous ne pouvez pas modifier les ressources d’une application, ce sont toutes des constantes. Au lieu de cela, vous pouvez enregistrer votre couleur dans SharedPrefences et utiliser la couleur à partir de là.

    Voir Comment utiliser SharedPreferences dans Android pour stocker, extraire et modifier des valeurs .

    Si votre application a déjà défini R.color.green et que vous souhaitez simplement y accéder en fonction de l’API renvoyée, utilisez:

     int resourceID = getResources().getIdentifier("green", "color", getPackageName()); 

    stocker les codes de couleur hexadécimaux dans sharedpreferences, puis utiliser la fonction parsecolor pour stocker tous vos codes hexadécimaux de couleurs dans des sessions sous forme de chaîne et chaque fois que vous voulez changer la couleur du bouton, textview..pour revenir à ce code
    par ex.
    session.setSsortingng("white","#FFFFFF"); Ssortingng colorname=session.getSsortingng("white");yourtextview.setBackgroundColor(Color.parseColor(colorname);