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?
- Acceso a recursos sin contexto
- Evitar Android Lint se queja de cadena no traducida
- ¿Se pueden descargar recursos de localización en tiempo de ejecución?
- Cómo detectar errores de variables de recursos en Android Studio (por ejemplo: "% 1 $ s")
- Android Home As Up Indicator nombre de archivo o ubicación
- ¿Es posible leer un archivo de texto sin referencia de contexto en un proyecto de biblioteca de Android?
- R no se puede resolver a una variable en un nuevo proyecto
- Obtener dibujable por cadena
- MissingTranslation para el idioma predeterminado ("..." no está traducido en "en")
- Intentando crear un proyecto después de agregar la carpeta values-21 y está mostrando error
- La entrada de recursos ya está definida
- ¿Hay un punto que tiene res / drawable-ldpi en android?
- El valor del recurso xml de entero de Android no cambia al cambiar entre retrato y paisaje
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; }