Resources.getColor(int id)Metoda została zaniechana.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Co powinienem zrobić?
Resources.getColor(int id)Metoda została zaniechana.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Co powinienem zrobić?
Odpowiedzi:
Począwszy od Androida Wsparcia Biblioteki 23,
nowy GetColor () metoda został dodany do ContextCompat.
Jego opis z oficjalnego JavaDoc:
Zwraca kolor powiązany z określonym identyfikatorem zasobu
Począwszy od M, zwracany kolor będzie stylizowany dla określonego motywu kontekstu.
Więc po prostu zadzwoń :
ContextCompat.getColor(context, R.color.your_color);
Możesz sprawdzić ContextCompat.getColor() kod źródłowy na GitHub .
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
Wyjaśnienie:
Będziesz musiał użyć ContextCompat.getColor () , który jest częścią biblioteki Support V4 (będzie działać dla wszystkich poprzednich interfejsów API).
ContextCompat.getColor(context, R.color.my_color)
Jeśli jeszcze nie korzystasz z biblioteki wsparcia, musisz dodać następujący wiersz do dependenciestablicy w aplikacji build.gradle(uwaga: jest to opcjonalne, jeśli już korzystasz z biblioteki appcompat (V7) ):
compile 'com.android.support:support-v4:23.0.0' # or any version above
Jeśli zależy Ci na motywach, dokumentacja określa, że:
Począwszy od M, zwracany kolor będzie stylizowany dla określonego motywu kontekstu
M, zwrócony kolor będzie stylizowany na temat określonego kontekstu w. ”
ContextCompatklasa pochodzi z SupportV4. AppcompatV7 również działa, ponieważ opiera się na SupportV4. Jak mówią w dokumentacji biblioteki Pomoc , 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.. Dlatego nie ma sensu udzielać AppcompatV7odpowiedzi.
Nie chcę dołączać biblioteki wsparcia tylko dla getColor , więc używam czegoś takiego
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);
}
}
Myślę, że kod powinien działać dobrze, a przestarzałe getColornie może zniknąć z API <23.
I tego właśnie używam w Kotlinie:
/**
* 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);
W systemie Android Marshmallow wiele metod jest przestarzałych.
Na przykład, aby uzyskać kolor
ContextCompat.getColor(context, R.color.color_name);
Również, aby uzyskać możliwość rysowania
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Dla wszystkich użytkowników Kotlin:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary). Zmienna „it” może być dowolna, ale musi być kontekstem .
itjest w tym przypadku context, ponieważ używam context?.let {do sprawdzenia, czy contextnie jest zerowa. Funkcja getColor()akceptuje tylko kontekst inny niż null. Przeczytaj więcej o tym leti jak z niego korzystać: kotlinlang.org/docs/reference/scope-functions.html#let
W swoim urządzeniu do recyklingu Zobacz w 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
}
}
Skorzystaj z getColor(Resources, int, Theme)metody z ResourcesCompatBiblioteki pomocy technicznej Androida.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Myślę, że lepiej odzwierciedlić swoje pytanie niż getColor(Context, int)z ContextCompatskoro pytasz o Resources. Przed wersją interfejsu API poziomu 23 motyw nie zostanie zastosowany, a metoda wywoła funkcję, getColor(int)ale nie będzie już przestarzałe ostrzeżenie. Temat może być również null.
Jeśli niekoniecznie potrzebujesz zasobów, użyj parseColor(String):
Color.parseColor("#cc0066")
Jeśli twój obecny min. Poziom interfejsu API to 23, możesz po prostu używaćgetColor() tak, jak my, aby uzyskać zasoby ciągów przez getString():
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
Możesz ograniczyć poziomy API poniżej 23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
ale dla uproszczenia możesz zrobić jak poniżej, jako zaakceptowaną odpowiedź:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
Z zasobów .
Sfrustrowałem się też. Moja potrzeba była bardzo prosta. Wszystko czego chciałem to kolor ARGB z zasobów, więc napisałem prostą metodę statyczną.
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;
}