El Resources.getColor(int id)
método ha quedado en desuso.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
¿Qué tengo que hacer?
El Resources.getColor(int id)
método ha quedado en desuso.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
¿Qué tengo que hacer?
Respuestas:
A partir de la Biblioteca de soporte de Android 23,
se ha agregado
un nuevo método getColor ()ContextCompat
.
Su descripción del JavaDoc oficial:
Devuelve un color asociado con un ID de recurso particular
Comenzando en M, el color devuelto tendrá un estilo para el tema del Contexto especificado.
Entonces, solo llame :
ContextCompat.getColor(context, R.color.your_color);
Puede consultar el ContextCompat.getColor()
código fuente en GitHub .
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
Explicación:
Deberá usar ContextCompat.getColor () , que forma parte de la Biblioteca de Support V4 (funcionará para todas las API anteriores).
ContextCompat.getColor(context, R.color.my_color)
Si aún no usa la Biblioteca de soporte, deberá agregar la siguiente línea a la dependencies
matriz dentro de su aplicación build.gradle
(nota: es opcional si ya usa la biblioteca appcompat (V7) ):
compile 'com.android.support:support-v4:23.0.0' # or any version above
Si le interesan los temas, la documentación especifica que:
Comenzando en M, el color devuelto tendrá un estilo para el tema del contexto especificado
M
, el color devuelto tendrá el estilo del tema del Contexto especificado "
ContextCompat
clase proviene de SupportV4. AppcompatV7 también funciona, ya que se basa en SupportV4. Como dicen en la documentación de la biblioteca de apoyo , This library depends on the v4 Support Library. If you are using Ant or Eclipse, make sure you include the v4 Support Library as part of this library's classpath.
. Por lo tanto, tiene sentido no poner AppcompatV7
la respuesta.
No quiero incluir la biblioteca de soporte solo para getColor , así que estoy usando algo como
public static int getColorWrapper(Context context, int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getColor(id);
} else {
//noinspection deprecation
return context.getResources().getColor(id);
}
}
Supongo que el código debería funcionar bien, y lo obsoleto getColor
no puede desaparecer de la API <23.
Y esto es lo que estoy usando en Kotlin:
/**
* Returns a color associated with a particular resource ID.
*
* Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].
*/
@Suppress("DEPRECATION")
@ColorInt
fun getColorHelper(context: Context, @ColorRes id: Int) =
if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);
En Android Marshmallow, muchos métodos están en desuso.
Por ejemplo, para usar el color
ContextCompat.getColor(context, R.color.color_name);
También para obtener un uso dibujable
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Para todos los usuarios de Kotlin:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
. La variable "it" podría ser cualquier cosa, pero debe ser un Contexto .
it
es en este caso el context
, ya que uso context?.let {
para verificar si el context
no es nulo. La función getColor()
solo acepta un contexto no nulo. Lea más aquí sobre let
y cómo usarlo: kotlinlang.org/docs/reference/scope-functions.html#let
En su recicladorVer en Kotlin
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(t: YourObject, listener: OnItemClickListener.YourObjectListener) = with(itemView) {
textViewcolor.setTextColor(ContextCompat.getColor(itemView.context, R.color.colorPrimary))
textViewcolor.text = t.name
}
}
Utilice el getColor(Resources, int, Theme)
método de la ResourcesCompat
Biblioteca de soporte de Android.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Creo que refleja mejor tu pregunta que la getColor(Context, int)
de la ContextCompat
que preguntas Resources
. Antes del nivel 23 de API, el tema no se aplicará y el método llamará getColor(int)
pero no tendrá la advertencia en desuso. El tema también puede ser null
.
Si no necesariamente necesita los recursos, use parseColor(String)
:
Color.parseColor("#cc0066")
Si su actual min. El nivel de API es 23, simplemente puede usarlogetColor()
como lo estamos usando para obtener recursos de cadena al getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
Puede restringir los niveles de API por debajo de 23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
pero para que sea simple, puede hacer lo siguiente como respuesta aceptada:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
De los recursos .
Desde ContextCompat AndroidX .
Yo también me frustré. Mi necesidad era muy directa. Todo lo que quería era el color ARGB de los recursos, así que escribí un método estático simple.
protected static int getARGBColor(Context c, int resId)
throws Resources.NotFoundException {
TypedValue color = new TypedValue();
try {
c.getResources().getValue(resId, color, true);
}
catch (Resources.NotFoundException e) {
throw(new Resources.NotFoundException(
String.format("Failed to find color for resourse id 0x%08x",
resId)));
}
if (color.type != TYPE_INT_COLOR_ARGB8) {
throw(new Resources.NotFoundException(
String.format(
"Resourse id 0x%08x is of type 0x%02d. Expected TYPE_INT_COLOR_ARGB8",
resId, color.type))
);
}
return color.data;
}