Respuestas:
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
android.R.color.some_colorejemplo: getResources().getColor(android.R.color.holo_blue_bright)(al menos, en API 17)
ContextCompaty ResourcesCompat? Si no hay una diferencia práctica, sería menos confuso si eliminara uno de ellos de su respuesta.
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
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.
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>
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);
getResources()en un Activityo Fragment?
getResources()fuera de una actividad o fragmento.
getResources()también está disponible como API pública en cualquier cosa que implemente Context y también en Views.
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);
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 ()
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.
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));
}
}
Resources.getColor(int, Theme)si puede? No debe atrapar excepciones de tiempo de ejecución.
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)
);
Encontré una manera más fácil que también funciona:
Color.parseColor(getString(R.color.idname);
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;
}
}
Método de trabajo más reciente:
getColor(R.color.snackBarAction)
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));
}
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))