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 dependencies
tablicy 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. ”
ContextCompat
klasa 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ć AppcompatV7
odpowiedzi.
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 getColor
nie 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 .
it
jest w tym przypadku context
, ponieważ używam context?.let {
do sprawdzenia, czy context
nie jest zerowa. Funkcja getColor()
akceptuje tylko kontekst inny niż null. Przeczytaj więcej o tym let
i 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 ResourcesCompat
Biblioteki 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 ContextCompat
skoro 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;
}