getColor (int id) deprecated on Android 6.0 Marshmallow (API 23)

Metoda Resources.getColor(int id) została wycofana.

@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}
Co mam zrobić?
Author: Johnny Five, 2015-07-23

12 answers

Począwszy od Android Support Library 23,
nowa metoda getColor () została dodana 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.


Po Prostu zadzwoń :

ContextCompat.getColor(context, R.color.your_color);

Możesz sprawdzić ContextCompat.getColor() kod źródłowy na GitHub .

 1395
Author: araks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Tl; dr:

ContextCompat.getColor(context, R.color.my_color)

Wyjaśnienie:

Będziesz musiał użyć ContextCompat.getColor () , która jest częścią biblioteki Support V4 (będzie działać dla wszystkich poprzednich API).

ContextCompat.getColor(context, R.color.my_color)

Jeśli nie używasz jeszcze biblioteki wsparcia, musisz dodać następującą linię do tablicy dependencies wewnątrz aplikacji build.gradle (Uwaga: jest to opcjonalne, jeśli używasz już biblioteki appcompat (V7) ):

compile 'com.android.support:support-v4:23.0.0' # or any version above

Jeśli zależy ci na tematach, dokumentacja określa że:

Począwszy od M, zwracany kolor będzie stylizowany na określony Temat kontekstu

 512
Author: Melvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-12 05:25:46

Nie chcę dołączać biblioteki wsparcia tylko dla getColor , więc używam czegoś w rodzaju

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ły getColor nie może zniknąć z API

A to jest to, czego 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);
 49
Author: Alex Vang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-29 12:00:26

W Androidzie Marshmallow wiele metod jest przestarzałych.

Na przykład, aby uzyskać kolor użyj

ContextCompat.getColor(context, R.color.color_name);

Również, aby uzyskać drawable use

ContextCompat.getDrawable(context, R.drawable.drawble_name);
 30
Author: Ashokchakravarthi Nagarajan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-15 06:11:06

Dla wszystkich użytkowników Kotlina:

context?.let {
    val color = ContextCompat.getColor(it, R.color.colorPrimary)
    // ...
}
 30
Author: Paul Spiesberger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 17:18:25

W Kotlinie możesz zrobić:

ContextCompat.getColor(requireContext(), R.color.stage_hls_fallback_snackbar)

If requiecontext () jest dostępne z miejsca, w którym wywołujesz funkcję. Otrzymałem błąd podczas próby

ContextCompat.getColor(context, R.color.stage_hls_fallback_snackbar)
 5
Author: Jamie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-24 18:04:34

W Twoim RecyclerView w Kotlinie

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
    }
}
 4
Author: Irvin Joao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-10 17:51:35

If your current min. Poziom API to 23, możesz po prostu użyć getColor() podobnie jak używamy do pobierania zasobów string 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 aby to uprościć, możesz zrobić jak poniżej jako zaakceptowaną odpowiedź:

textView.setTextColor(ContextCompat.getColor(context, R.color.green))

Z Zasobów.

From ContextCompat AndroidX.

From ContextCompat Support

 2
Author: Blasanka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-11 23:45:34

Jeśli niekoniecznie potrzebujesz zasobów, użyj parseColor(String):
Color.parseColor("#cc0066")

 1
Author: N. Osil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 03:22:48

Użyj metody getColor(Resources, int, Theme) ResourcesCompat z biblioteki wsparcia dla Androida.

int white = ResourcesCompat.getColor(getResources(), R.color.white, null);

Myślę, że lepiej oddaje twoje pytanie niż getColor(Context, int) z ContextCompat, ponieważ pytasz o Resources. Przed poziomem API 23 motyw nie zostanie zastosowany, A metoda wywoła się do getColor(int), ale nie będziesz mieć przestarzałego Ostrzeżenia. Tematem może być również null.

 1
Author: Pedro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-08 07:57:08

Ja też się sfrustrowałem. 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;
}
 0
Author: steven smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-03 07:41:40

Najlepszym odpowiednikiem jest użycie ContextCompat.getColor i ResourcesCompat.getColor. Zrobiłem kilka rozszerzeń dla szybkiej migracji:

@ColorInt
fun Context.getColorCompat(@ColorRes colorRes: Int) = ContextCompat.getColor(this, colorRes)

@ColorInt
fun Fragment.getColorCompat(@ColorRes colorRes: Int) = activity!!.getColorCompat(colorRes)

@ColorInt
fun Resources.getColorCompat(@ColorRes colorRes: Int) = ResourcesCompat.getColor(this, colorRes, null)
 0
Author: android developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-08 08:08:38