getColor (int id) desaprobado en Android 6.0 Marshmallow (API 23)

El método Resources.getColor(int id) ha sido desaprobado.

 @ColorInt @Deprecated public int getColor(@ColorRes int id) throws NotFoundException { return getColor(id, null); } 

¿Que debería hacer?

A partir de Android Support Library 23,
Se ha agregado un nuevo método getColor () a ContextCompat .

Su descripción del JavaDoc oficial:

Devuelve un color asociado con una ID de recurso particular

Comenzando en M, el color devuelto se diseñará para el tema del Contexto especificado.

Entonces, solo llama :

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

Puede verificar el código fuente de ContextCompat.getColor() en GitHub .

tl; dr:

 ContextCompat.getColor(context, R.color.my_color) 

Explicación:

Tendrá que usar ContextCompat.getColor () , que es 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 matriz de dependencies 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 importan los temas, la documentación especifica que:

Comenzando en M, el color devuelto se diseñará para el tema del Contexto especificado

No quiero incluir la biblioteca de soporte solo para getColor , entonces 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 el obsoleto getColor no puede desaparecer de la API <23.

En Android Marshmallow, muchos métodos están en desuso.

Por ejemplo, para obtener el uso del color

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

También para obtener uso dibujable

 ContextCompat.getDrawable(context, R.drawable.drawble_name); 

Para Drawable

 ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow) 

Para el color

  ContextCompat.getColor(getApplicationContext(),R.color.red) 

Puedes usar:

 if (Build.VERSION.SDK_INT >= 23) { return ctx.getColor(R.color.YOURCOLOR); } else { return ctx.getRecources().getColor(R.color.YOURCOLOR); } 

Probado en Android Marshmallow. Funcionó.

La respuesta más corta es:

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

El método getColor () está en desuso en API 23, y se introdujo en ContextCompat. Antes de usar el método getColor () usando ContextCompat, agregue las dependencias en el script build.gradle, que es:

 dependencies{ // Other stuff compile 'com.android.support:support-v4:23.0.0' } 

Entonces el método getColor () se puede usar como:

 int colorcode = ContextCompat.getColor(getApplicationContext(), R.color.your_color); 

Para todos los usuarios de Kotlin:

 context?.let { val color = ContextCompat.getColor(it, R.color.colorPrimary) // ... } 

Utilizar esta:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return context.getResources().getColor(id, context.getTheme()); } else { return context.getResources().getColor(id); } 

Utilice el getColor(Resources, int, Theme) de ResourcesCompat de la Biblioteca de soporte de Android.

 int white = new ResourcesCompat().getColor(getResources(), R.color.white, null); 

Creo que refleja mejor tu pregunta que el getColor(Context, int) de ContextCompat ya que preguntas sobre Resources . Antes del nivel 23 de API, el tema no se aplicará y el método llamará a getColor(int) pero no tendrá la advertencia obsoleta. El tema también puede ser null .

En Mono / xamarin.android tuve el mismo problema y el siguiente código funcionó perfectamente:

 ContextCompat.GetColor (context, Resource.Color.myColor) 

En mi caso, el contexto es mi actividad (Android.Support.V7.App.AppCompatActivity) por lo que mi ejemplo de uso real es:

 var color = new Android.Graphics.Color(ContextCompat.GetColor(this, Resource.Color.myColor)) 

Aunque getColor() está en desuso en malvavisco, el método de reemplazo
getColor(int, Theme) está disponible. Que se puede usar como una alternativa a ContextCompat.getColor(context, R.color.your_color);

remítalo para más información.

Si no necesita necesariamente los recursos, use parseColor(String) :
Color.parseColor("#cc0066")

De esta manera:

 fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.badge_participants_counter_color))); 

Me sentí frustrado también. Mi necesidad fue 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; } 

Código con soporte multi API:

 if (Build.VERSION.SDK_INT < 23) { view.setBackgroundColor(getResources().getColor(android.R.color.white)); } else { view.setBackgroundColor(getContext().getColor(android.R.color.white)); }