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_color
ejemplo: getResources().getColor(android.R.color.holo_blue_bright)
(al menos, en API 17)
ContextCompat
y 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 ThemeOverlay
uso 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
Theme
se 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 Activity
o 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 Context
acceso , 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á Context
como 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 Resources
a su Application
clase 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
<application
etiqueta. (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
. enum
Ofrece 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_INT
siguiente:
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))