Il Resources.getColor(int id)
metodo è stato deprecato.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Cosa dovrei fare?
Il Resources.getColor(int id)
metodo è stato deprecato.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Cosa dovrei fare?
Risposte:
A partire dalla libreria di supporto Android 23,
è stato aggiunto
un nuovo metodo getColor ()ContextCompat
.
La sua descrizione dal JavaDoc ufficiale:
Restituisce un colore associato a un particolare ID risorsa
A partire da M, il colore restituito verrà disegnato in base al tema del contesto specificato.
Quindi, basta chiamare :
ContextCompat.getColor(context, R.color.your_color);
Puoi controllare il ContextCompat.getColor()
codice sorgente su GitHub .
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
Spiegazione:
Dovrai utilizzare ContextCompat.getColor () , che fa parte della libreria Support V4 (funzionerà per tutte le API precedenti).
ContextCompat.getColor(context, R.color.my_color)
Se non si utilizza già la libreria di supporto, sarà necessario aggiungere la seguente riga dependencies
all'array all'interno dell'app build.gradle
(nota: è facoltativo se si utilizza già la libreria appcompat (V7) ):
compile 'com.android.support:support-v4:23.0.0' # or any version above
Se ti interessano i temi, la documentazione specifica che:
A partire da M, il colore restituito verrà disegnato in base al tema del contesto specificato
M
, il colore restituito sarà disegnato per il tema del contesto specificato " .
ContextCompat
classe proviene da SupportV4. AppcompatV7 funziona anche in quanto si basa su SupportV4. Come si dice sulla documentazione di libreria di supporto , 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.
. Quindi ha senso non dare AppcompatV7
la risposta.
Non voglio includere la libreria di supporto solo per getColor , quindi sto usando qualcosa di simile
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);
}
}
Immagino che il codice dovrebbe funzionare bene e il deprecato getColor
non può scomparire dall'API <23.
E questo è quello che sto usando in 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);
In Android Marshmallow molti metodi sono obsoleti.
Ad esempio, per ottenere l'uso del colore
ContextCompat.getColor(context, R.color.color_name);
Anche per ottenere un uso disegnabile
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Per tutti gli utenti di Kotlin là fuori:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
. La variabile "it" potrebbe essere qualsiasi cosa, ma deve essere un contesto .
it
è in questo caso il context
, poiché utilizzo context?.let {
per verificare se context
non è null. La funzione getColor()
accetta solo un contesto non nullo. Per saperne di più qui let
e come usarlo: kotlinlang.org/docs/reference/scope-functions.html#let
In Your RecyclerView in 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
}
}
Utilizzare il getColor(Resources, int, Theme)
metodo della ResourcesCompat
dalla libreria di supporto Android.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Penso che rifletta meglio la tua domanda rispetto a quella getColor(Context, int)
di ContextCompat
quando chiedi Resources
. Prima del livello API 23, il tema non verrà applicato e il metodo verrà richiamato getColor(int)
ma non avrai l'avviso deprecato. Il tema potrebbe anche essere null
.
Se non hai necessariamente bisogno delle risorse, usa parseColor(String)
:
Color.parseColor("#cc0066")
Se il tuo attuale min. Il livello API è 23, puoi semplicemente usaregetColor()
come stiamo usando per ottenere risorse di stringa getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
Puoi limitare i livelli API inferiori a 23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
ma per mantenerlo semplice, puoi fare come di seguito come risposta accettata:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
Dalle risorse .
Mi sono anche frustrato. Il mio bisogno era molto semplice. Tutto quello che volevo era il colore ARGB dalle risorse, quindi ho scritto un semplice metodo statico.
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;
}