Die Resources.getColor(int id)Methode ist veraltet.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Was sollte ich tun?
Die Resources.getColor(int id)Methode ist veraltet.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Was sollte ich tun?
Antworten:
Ab Android Support Library 23 wurde
eine neue Methode getColor () hinzugefügt ContextCompat.
Seine Beschreibung aus dem offiziellen JavaDoc:
Gibt eine Farbe zurück, die einer bestimmten Ressourcen-ID zugeordnet ist
Ab M wird die zurückgegebene Farbe für das angegebene Kontextthema gestaltet.
Also, rufen Sie einfach an :
ContextCompat.getColor(context, R.color.your_color);
Sie können den ContextCompat.getColor() Quellcode auf GitHub überprüfen .
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
Erläuterung:
Sie müssen ContextCompat.getColor () verwenden , das Teil der Support V4-Bibliothek ist (es funktioniert für alle vorherigen APIs).
ContextCompat.getColor(context, R.color.my_color)
Wenn Sie die Support-Bibliothek noch nicht verwenden, müssen Sie dem dependenciesArray in Ihrer App die folgende Zeile hinzufügen build.gradle(Hinweis: Dies ist optional, wenn Sie die Appcompat-Bibliothek (V7) bereits verwenden ):
compile 'com.android.support:support-v4:23.0.0' # or any version above
Wenn Sie sich für Themen interessieren, wird in der Dokumentation Folgendes angegeben:
Ab M wird die zurückgegebene Farbe für das angegebene Kontextthema gestaltet
Mdie zurück Farbe wird für den angegebenen Kontext des Themas gestylt werden. “
ContextCompatstammt die Klasse von SupportV4. AppcompatV7 funktioniert auch, da es auf SupportV4 basiert. Wie sie sagen auf der Support Library Dokumentation , 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.. Es ist also sinnvoll, AppcompatV7die Antwort nicht einzugeben.
Ich möchte die Support-Bibliothek nicht nur für getColor einbinden , also verwende ich so etwas wie
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);
}
}
Ich denke, der Code sollte einwandfrei funktionieren und der veraltete Code getColorkann nicht aus der API <23 verschwinden.
Und das verwende ich 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 sind viele Methoden veraltet.
Zum Beispiel, um Farbe zu verwenden
ContextCompat.getColor(context, R.color.color_name);
Auch zum Zeichnen verwendbar
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Für alle Kotlin-Benutzer da draußen:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary). Die Variable "it" kann alles sein, muss aber ein Kontext sein .
itist in diesem Fall das context, da ich benutze um context?.let {zu prüfen ob das contextnicht null ist. Die Funktion getColor()akzeptiert nur einen Nicht-Null-Kontext. Lesen Sie hier mehr darüber letund wie man es benutzt: kotlinlang.org/docs/reference/scope-functions.html#let
In Ihrer 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
}
}
Verwenden Sie die getColor(Resources, int, Theme)Methode von ResourcesCompataus der Android Support Library.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Ich denke, es spiegelt Ihre Frage besser wider als die, getColor(Context, int)nach der ContextCompatSie gefragt haben Resources. Vor API-Level 23 wird das Thema nicht angewendet und die Methode ruft auf, getColor(int)aber Sie erhalten keine veraltete Warnung. Das Thema kann auch sein null.
Wenn Sie die Ressourcen nicht unbedingt benötigen, verwenden Sie parseColor(String):
Color.parseColor("#cc0066")
Wenn Ihre aktuelle min. Die API-Ebene ist 23, Sie können sie einfach so verwenden,getColor() wie wir sie verwenden, um Zeichenfolgenressourcen abzurufen, indem Sie getString():
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
Sie können Einschränkungen für API-Ebenen unter 23 festlegen:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
aber um es einfach zu halten, können Sie wie folgt als akzeptierte Antwort tun:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
Aus Ressourcen .
Von ContextCompat AndroidX .
Ich war auch frustriert. Mein Bedürfnis war sehr einfach. Alles, was ich wollte, war die ARGB-Farbe aus den Ressourcen, also schrieb ich eine einfache statische Methode.
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;
}