web-dev-qa-db-fra.com

Obtenir color-int depuis la ressource color

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)
);
364
ataulm

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
795
sat

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);
104
Ultimo_m

Définis ta couleur

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>

Obtenir la couleur int et la définir

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

Voir également

30
Suragch

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

Meilleure approche

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

Ce que je fais c'est

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 ()

Problème (quand vous n'avez pas de contexte)

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.

2
Khemraj

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

0
indrajeet jyoti

Les réponses ici sont trop compliquées. Pas besoin de bibliothèques de support.

Avant l'API 23 (guimauve)

getResources().getColor(R.color.idname);

Après

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)
0
MattSchmatt

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;
  }
}
0
Confuse