Obtenga color-int del recurso de color

448

¿Hay alguna manera de obtener un color-int de un recurso de color? Estoy tratando de obtener los componentes individuales rojo, azul y verde de un color definido en el recurso (R.color.myColor) para poder establecer los valores de tres barras de búsqueda en un nivel específico.

ataulm
fuente

Respuestas:

928

Puedes usar:

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

Consulte aquí cómo definir colores personalizados:

http://sree.cc/google/android/defining-custom-colors-using-xml-in-android

EDITAR (1): dado getColor(int id)que ahora está en desuso , se debe usar:

ContextCompat.getColor(context, R.color.your_color);

(agregado en la biblioteca de soporte 23)

EDITAR (2):

El siguiente código se puede usar tanto para pre y post Marshmallow (API 23)

ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme

ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme
se sentó
fuente
77
¿Qué pasa con android.R.color.some_color :-(
Blundell
17
@Blundell uhh, no sé si lo necesitas ahora, pero esto también funciona, por android.R.color.some_colorejemplo: getResources().getColor(android.R.color.holo_blue_bright)(al menos, en API 17)
ataulm
30
getColor () ahora está en desuso, puede usar: ContextCompat.getColor (context, R.color.your_color);
Ricardo
2
Me doy cuenta de que no fue usted quien realizó las modificaciones, pero ¿cuál es la diferencia entre ContextCompaty ResourcesCompat? Si no hay una diferencia práctica, sería menos confuso si eliminara uno de ellos de su respuesta.
Suragch 01 de
14
¿Por qué Google siente la necesidad de desaprobar una función perfectamente buena para esa horrible biblioteca compacta de aplicaciones? Es una mierda, tener ambos.
Andrew S
116

Basado en la nueva Biblioteca de soporte de Android (y esta actualización), ahora debe llamar a:

ContextCompat.getColor(context, R.color.name.color);

De acuerdo con la documentación :

public int getColor (int id)

Este método fue desaprobado en el nivel 23 de API . Utilice getColor (int, Theme) en su lugar

Es la misma solución para getResources().getColorStateList(id) :

Tienes que cambiarlo así:

ContextCompat.getColorStateList(getContext(),id);

EDITAR 2019

Con respecto al ThemeOverlayuso del contexto de la vista más cercana:

val color = ContextCompat.getColor(
  closestView.context,
  R.color.name.color
)

De esta manera, obtienes el color correcto según tu ThemeOverlay.

Especialmente necesario cuando en la misma actividad usas diferentes temas, como el tema oscuro / claro. Si desea comprender más sobre Temas y Estilos, se sugiere esta charla: Desarrollo de Temas con Estilo

Nick Butcher - Droidcon Berlin - Desarrollando temas con estilo

Ultimo_m
fuente
10
Para los que preguntan qué rellene como el tema en el nuevo método, Themese pueden pasar como nula, por lo que sólo llamar getColor(R.color.my_color, null)si no está seguro de lo que pasa en el tema.
w3bshark
hmm ... esto es lo que todos dicen pero no puedo hacer que funcione. ¿Tengo que inicializar el contexto? Actualmente obtengo "no se puede resolver el símbolo 'contexto'"
ColdTuna
Para asegurarse de que lo está haciendo bien, intente llamarlo dentro de onCreate de la actividad, que para obtener el contexto que necesita llamar a getContext () o simplemente "this"
Ultimo_m
35

Define tu color

valores / 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>

Obtenga el color int y configúrelo

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

Ver también

Suragch
fuente
1
¿solo se puede usar getResources()en un Activityo Fragment?
Zapnologica
2
@Zapnologica, vea las respuestas a esta pregunta para reflexionar sobre el uso getResources()fuera de una actividad o fragmento.
Suragch
1
@Zapnologica no. getResources()también está disponible como API pública en cualquier cosa que implemente Context y también en Views.
ataulm
7

Mejor enfoque

Como @sat responde, un buen enfoque para obtener color es

ResourcesCompat.getColor(getResources(), R.color.your_color, null);

o use a continuación cuando no tenga acceso al getResources()método.

Context context  = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);

Lo que hago es

public void someMethod(){
    ...
    ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}

¡Es más fácil de usar en cualquier lugar de su aplicación! Incluso en la clase Util o en cualquier clase donde no tenga Context o getResource ()

Problema (cuando no tienes contexto)

Cuando no tiene Contextacceso , como un método en suUtil clase.

Asuma el siguiente método sin contexto.

public void someMethod(){
    ...
    // can't use getResource() without Context.
}

Ahora pasará Contextcomo parámetro en este método y usarágetResources().

public void someMethod(Context context){
    ...
    context.getResources...
}

Así que aquí hay una solución única de bonificación mediante la cual puede acceder a recursos desde cualquier lugar Util class. Agregue Resourcesa su Applicationclase o cree uno si no existe.

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

}

Agregue un campo de nombre a su manifest.xml <applicationetiqueta. (Si no se ha agregado ya)

<application
        android:name=".App"
        ...
        >
        ...
    </application>

Ahora estás listo para irte. Usar ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);en cualquier lugar de la aplicación.

Khemraj
fuente
5

Actualicé para usar ContextCompat.getColor(context, R.color.your_color); pero a veces (en algunos dispositivos / versiones de Android. No estoy seguro) eso causa un NullPointerExcepiton.

Entonces, para que funcione en todos los dispositivos / versiones, recurro a la antigua forma de hacerlo, en el caso de un puntero nulo.

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));
    }
}
ninjachippie
fuente
¿por qué no usar la versión anterior en todos los casos, o si está verificando la versión de todos modos, use la nueva API Resources.getColor(int, Theme)si puede? No debe atrapar excepciones de tiempo de ejecución.
ataulm
Solo TOC, supongo. ContextCompat, para mí, parece ser la forma de hacerlo a prueba del futuro y, por lo tanto, la forma correcta. Entonces mi enfoque es, hacerlo de la manera correcta. Y si eso falla (en dispositivos antiguos o lo que sea), hágalo a la antigua usanza. ¿Por qué no debería atrapar excepciones en tiempo de ejecución?
ninjachippie
1

Para obtener más información sobre otro caso de uso que pueda ayudar a hacer surgir esta pregunta en los resultados de búsqueda, quería aplicar alfa a un color definido en mis recursos.

Usando la respuesta correcta 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)
);
ataulm
fuente
1

Encontré una manera más fácil que también funciona:

Color.parseColor(getString(R.color.idname);
geckoflume
fuente
Interesante, no me di cuenta de que podría obtener el color como una cadena de esta manera. No creo que sea más fácil, pero es interesante ata
ataulm
0

Acceder a los colores de una clase sin actividad puede ser difícil. Una de las alternativas que encontré fue usar enum. enumOfrece mucha flexibilidad.

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;
  }
}
Confundir
fuente
0

Método de trabajo más reciente:

getColor(R.color.snackBarAction)
zohaib Ansari
fuente
0

Si su actual min. El nivel de API es 23, simplemente puede usar getColor()como lo estamos usando para getString():

//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()

Si desea un nivel inferior al API 23, solo use esto:

textView.setTextColor(getResources().getColor(R.color.green));

Pero tenga en cuenta que getResources().getColor()está en desuso en el nivel API 23. En ese caso, reemplace arriba con:

textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`

ContextCompat : Ayuda para acceder a funciones enContext

Si lo desea, puede restringir con lo SDK_INTsiguiente:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    textView.setTextColor(getColor(R.color.green));
} else {
    textView.setTextColor(getResources().getColor(R.color.green));
}
Blasanka
fuente
0
ContextCompat.getColor(context, R.color.your_color);

en actividad

ContextCompat.getColor(actvityname.this, R.color.your_color);

en fragmento

ContextCompat.getColor(getActivity(), R.color.your_color);

por ejemplo:

tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))
indrajeet jyoti
fuente