GetColor (int id) obsoleta en Android 6.0 Marshmallow (API 23)
El método Resources.getColor(int id)
ha quedado obsoleto.
@ColorInt @Deprecated public int getColor(@ColorRes int id) throws NotFoundException { return getColor(id, null); }
¿Que puedo hacer?
- Android Home As Up Indicator nombre de archivo o ubicación
- Cómo obtener programaticamente lista de idiomas compatibles en un proyecto de Android (dispositivo NOT)
- Carpeta de activos en Android Studio Unit Test
- Obtener recursos extraíbles
- Android consigue la configuración regional del sistema diferentes
- FindViewById (android.R.id.progress) devuelve null
- Cadena dinámica utilizando String.xml?
- Utilizar Locale para obligar a Android a utilizar un archivo strings.xml específico para un idioma no compatible
- ¿Cómo puedo obtener un contenido de recursos desde un contexto estático?
- Biblioteca a recursos de cifrado y descifrado
- Cómo corregir: android.app.RemoteServiceException: Notificación incorrecta enviada desde el paquete *: No se pudo crear el icono: StatusBarIcon
- Cómo averiguar IDs o nombres de sistemas extraíbles (mapas de bits) precargados del volcado de memoria
- La entrada de recursos ya está definida
A partir de Android Support Library 23,
Un nuevo método getColor () se ha agregado a ContextCompat
.
Su descripción de la JavaDoc oficial:
Devuelve un color asociado con un ID de recurso particular
A partir de M, el color devuelto se denominará para el tema del Contexto especificado.
Así que, llame a :
ContextCompat.getColor(context, R.color.your_color);
Puede comprobar el código fuente ContextCompat.getColor()
en GitHub .
Tendrá que utilizar ContextCompat.getColor () , que forma parte de la Biblioteca de Soporte V4 (por lo que funcionará para todas las API anteriores).
ContextCompat.getColor(context, R.color.my_color)
Si aún no usa la Biblioteca de Soporte, necesitará agregar la siguiente línea a la matriz de dependencies
dentro de su aplicación build.gradle
(nota: es opcional si ya usa la librería 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:
A partir de M, el color devuelto se denominará para el tema del Contexto especificado
No quiero incluir la biblioteca de soporte sólo 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 el obsoleto getColor no puede desaparecer de la API <23.
En Android Marshmallow muchos métodos están obsoletos.
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)
La respuesta más corta es:
ContextCompat.getColor(context, R.color.colorAccent);
Puedes usar:
if (Build.VERSION.SDK_INT >= 23) { return ctx.getColor(R.color.YOURCOLOR); } else { return ctx.getRecources().getColor(R.color.YOURCOLOR); }
Espero que ayude. Lo probé en Android Marshmallow, y funcionó.
El método getColor () está obsoleto en la API 23 y se introdujo en ContextCompat. Antes de utilizar el método getColor () utilizando ContextCompat, añada las dependencias en la secuencia de comandos build.gradle, que es:
dependencies{ // Other stuff compile 'com.android.support:support-v4:23.0.0' }
A continuación, el método getColor () se puede utilizar como:
int colorcode = ContextCompat.getColor(getApplicationContext(), R.color.your_color);
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) así que un ejemplo de mi uso real es:
var color = new Android.Graphics.Color(ContextCompat.GetColor(this, Resource.Color.myColor))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return context.getResources().getColor(id, context.getTheme()); } else { return context.getResources().getColor(id); }
Hacer uso de esto.
A pesar de que getColor()
es obsoleto en malvavisco, el método de reemplazo
getColor(int, Theme)
está disponible. Que se puede utilizar como una alternativa a ContextCompat.getColor(context, R.color.your_color);
Consulte esto para obtener más información.
Utilice el getColor(Resources, int, Theme)
del ResourcesCompat
de la Biblioteca de soporte técnico de Android.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Pienso que refleja mejor su pregunta que el getColor(Context, int)
del ContextCompat
desde que usted pregunta 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
.
De esta manera:
fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.badge_participants_counter_color)));
Me sentí frustrado también. Mi necesidad era muy directa. Todo lo que quería era el color ARGB de los recursos, por lo 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; }