Existe-t-il un moyen d'obtenir un int de couleur à partir d'une ressource de couleur? J'essaie d'obtenir les composants individuels rouge, bleu et vert d'une couleur définie dans la ressource (R.color.myColor) afin de pouvoir définir les valeurs de trois barres de recherche à un niveau spécifique.
Pour plus d'informations sur un autre cas d'utilisation pouvant aider à faire ressortir cette question dans les résultats de recherche, je souhaitais appliquer l'alpha à une couleur définie dans mes ressources.
En utilisant la réponse correcte de @ sat:
int alpha = ... // 0-255, calculated based on some business logic
int actionBarBackground = getResources().getColor(R.color.actionBarBackground);
int actionBarBackgroundWithAlpha = Color.argb(
alpha,
Color.red(actionbarBackground),
Color.green(actionbarBackground),
Color.blue(actionbarBackground)
);
Vous pouvez utiliser:
getResources().getColor(R.color.idname);
Vérifiez ici comment définir des couleurs personnalisées:
http://sree.cc/google/Android/defining-custom-colors-using-xml-in-Android
EDIT (1): Puisque getColor(int id)
est deprecated maintenant, vous devez l'utiliser:
ContextCompat.getColor(context, R.color.your_color);
(ajouté dans la bibliothèque de support 23)
EDIT (2):
Le code ci-dessous peut être utilisé avant et après Marshmallow (API 23)
ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme
ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme
Basé sur la nouvelle Android Support Library (et this update), vous devez maintenant appeler:
ContextCompat.getColor(context, R.color.name.color);
Selon la documentation :
public int getColor (int id)
Cette méthode était obsolète dans API niveau 23 . Utilisez getColor (int, Theme) à la place.
C'est la même solution pour getResources().getColorStateList(id)
:
Vous devez le changer comme ceci:
ContextCompat.getColorStateList(getContext(),id);
values / color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- color int as #AARRGGBB (alpha, red, green, blue) -->
<color name="orange">#fff3632b</color>
...
<color name="my_view_color">@color/orange</color>
</resources>
int backgroundColor = ContextCompat.getColor(context, R.color.my_view_color);
// Color backgroundColor = ... (Don't do this. The color is just an int.)
myView.setBackgroundColor(backgroundColor);
J'ai mis à jour pour utiliser ContextCompat.getColor(context, R.color.your_color);
mais parfois (sur certains appareils/versions d'Android. Je ne suis pas sûr) que cela provoque un NullPointerExcepiton.
Donc, pour que cela fonctionne sur tous les appareils/versions, je retombe sur l'ancienne façon de le faire, dans le cas d'un pointeur nul.
try {
textView.setTextColor(ContextCompat.getColor(getActivity(), R.color.text_grey_dark));
}
catch(NullPointerException e) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getContext().getColor(R.color.text_grey_dark));
}
else {
textView.setTextColor(getResources().getColor(R.color.text_grey_dark));
}
}
Comme @sat répond, une bonne approche pour obtenir de la couleur est
ResourcesCompat.getColor(getResources(), R.color.your_color, null);
ou utilisez la méthode ci-dessous lorsque vous n'avez pas accès à la méthode getResources()
.
Context context = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);
public void someMethod(){
...
ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}
Il est très simple d'utiliser n'importe où dans votre application! Même dans la classe Util ou n'importe quelle classe où vous n'avez ni Context ni getResource ()
Quand vous n'avez pas Context
access, comme une méthode de votre classe Util
.
Supposons que la méthode ci-dessous soit sans contexte.
public void someMethod(){
...
// can't use getResource() without Context.
}
Maintenant, vous allez passer Context
en tant que paramètre dans cette méthode et utiliser getResources().
public void someMethod(Context context){
...
context.getResources...
}
Voici donc une solution unique Bonus grâce à laquelle vous pouvez accéder à des ressources n’importe où, comme Util class
. Ajoutez Resources
à votre classe Application
ou créez-en une si n’existe pas.
import Android.app.Application;
import Android.content.res.Resources;
public class App extends Application {
private static App mInstance;
private static Resources res;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
res = getResources();
}
public static App getInstance() {
return mInstance;
}
public static Resources getResourses() {
return res;
}
}
Ajoutez un champ de nom à votre balise manifest.xml
<application
. (Si non ajouté déjà)
<application
Android:name=".App"
...
>
...
</application>
Maintenant vous êtes prêt à partir. Utilisez ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
n'importe où dans l'application.
ContextCompat.getColor (context, R.color.your_color);
en activité
ContextCompat.getColor (actvityname.this, R.color.your_color);
en fragment
ContextCompat.getColor (getActivity (), R.color.your_color);
pour par exemple:
tvsun.settextcolour (ContextCompat.getColor (getActivity (), R.color.votre_couleur))
Les réponses ici sont trop compliquées. Pas besoin de bibliothèques de support.
getResources().getColor(R.color.idname);
getResources().getColor(R.color.idname, null);
Ajoutez un chèque et vous avez terminé:
int color = Build.VERSION.SDK_INT<23 ? getResources().getColor(R.color.idname) : getResources().getColor(R.color.idname,null)
L'accès aux couleurs d'une classe de non-activité peut être difficile. L'une des alternatives que j'ai trouvées utilisait enum
. enum
offre beaucoup de flexibilité.
public enum Colors
{
COLOR0(0x26, 0x32, 0x38), // R, G, B
COLOR1(0xD8, 0x1B, 0x60),
COLOR2(0xFF, 0xFF, 0x72),
COLOR3(0x64, 0xDD, 0x17);
private final int R;
private final int G;
private final int B;
Colors(final int R, final int G, final int B)
{
this.R = R;
this.G = G;
this.B = B;
}
public int getColor()
{
return (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
}
public int getR()
{
return R;
}
public int getG()
{
return G;
}
public int getB()
{
return B;
}
}