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 dependencies
Array 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
M
die zurück Farbe wird für den angegebenen Kontext des Themas gestylt werden. “
ContextCompat
stammt 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, AppcompatV7
die 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 getColor
kann 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 .
it
ist in diesem Fall das context
, da ich benutze um context?.let {
zu prüfen ob das context
nicht null ist. Die Funktion getColor()
akzeptiert nur einen Nicht-Null-Kontext. Lesen Sie hier mehr darüber let
und 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 ResourcesCompat
aus 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 ContextCompat
Sie 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;
}