it-swarm.com.de

getColor (int id) veraltet in Android 6.0 Marshmallow (API 23)

Die Methode Resources.getColor(int id) ist veraltet.

@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}

Was soll ich machen?

667
araks

Ausgehend von Android Support Library 23,
Eine neue getColor () Methode wurde zu ContextCompat hinzugefügt.

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 formatiert.


Also, rufen Sie einfach auf:

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


Sie können den ContextCompat.getColor()Quellcode auf GitHub überprüfen.

1288
araks

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 Supportbibliothek noch nicht verwenden, müssen Sie die folgende Zeile zum Array dependencies in Ihrer App build.gradle hinzufügen (Hinweis: ist optional, wenn Sie verwenden bereits die appcompat (V7) -Bibliothek ):

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 formatiert

481
Melvin

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 gut funktionieren und das veraltete getColor kann nicht aus API <23 verschwinden.

42
Alex Vang

In Android Marshmallow sind viele Methoden veraltet.

Zum Beispiel, um Farbe zu verwenden

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

Auch zum Zeichnen zu gebrauchen

ContextCompat.getDrawable(context, R.drawable.drawble_name);

Für alle Kotlin-Nutzer da draußen:

context?.let {
    val color = ContextCompat.getColor(it, R.color.colorPrimary)
    // ...
}
26
Spipau

Für Drawable

ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow)

Für Farbe

 ContextCompat.getColor(getApplicationContext(),R.color.red)
17
Tarun Voora

Sie können verwenden:

if (Build.VERSION.SDK_INT >= 23) {
    return ctx.getColor(R.color.YOURCOLOR);
} else {
    return ctx.getRecources().getColor(R.color.YOURCOLOR);
}

Getestet auf Android Marshmallow. Es funktionierte.

8
user6765242

Die kürzeste Antwort lautet:

ContextCompat.getColor(context, R.color.colorAccent);
7
Samira Ekrami

Die Methode getColor () ist in API 23 veraltet und wurde in ContextCompat eingeführt. Fügen Sie vor der Verwendung der Methode getColor () mit ContextCompat die Abhängigkeiten im Skript build.gradle hinzu. Diese lauten:

dependencies{

    // Other stuff

    compile 'com.Android.support:support-v4:23.0.0'
}

Dann kann die Methode getColor () wie folgt verwendet werden:

int colorcode = ContextCompat.getColor(getApplicationContext(), R.color.your_color);
7
singh.indolia

Code mit Multi-API-Unterstützung:

if (Build.VERSION.SDK_INT < 23) {
    view.setBackgroundColor(getResources().getColor(Android.R.color.white));
} else {
    view.setBackgroundColor(getContext().getColor(Android.R.color.white));
}
6
Dmitry

In Deiner 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
    }
}
2
Irvin Joao

Benutze das:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    return context.getResources().getColor(id, context.getTheme());
} else {
    return context.getResources().getColor(id);
}
2
Trinadh Koya

Verwenden Sie die getColor(Resources, int, Theme)-Methode von ResourcesCompat aus der Android Support-Bibliothek.

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

Ich denke, es spiegelt Ihre Frage besser wider als die getColor(Context, int) des ContextCompat, da Sie nach Resources fragen. Vor der API-Stufe 23 wird das Design nicht angewendet und die Methode ruft getColor(int) auf, es wird jedoch keine veraltete Warnung angezeigt. Das Thema kann auch null sein.

2
Pedro

In Mono/xamarin.Android hatte ich das gleiche Problem und der folgende Code funktionierte einwandfrei:

ContextCompat.GetColor (context, Resource.Color.myColor)

In meinem Fall ist der Kontext meine Aktivität (Android.Support.V7.App.AppCompatActivity). Ein Beispiel für meine reale Verwendung ist also:

var color = new Android.Graphics.Color(ContextCompat.GetColor(this, Resource.Color.myColor))    
2
Daniele D.

Obwohl getColor() in Marshmallow, der Ersetzungsmethode, veraltet ist
getColor(int, Theme) ist verfügbar. Welche kann als Alternative zu ContextCompat.getColor(context, R.color.your_color); verwendet werden

weitere Informationen finden Sie unter this .

1
war_Hero

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;
}
0
steven smith

Wenn Sie die Ressourcen nicht unbedingt benötigen, verwenden Sie parseColor(String) :
Color.parseColor("#cc0066")

0
N. Osil

Diesen Weg:

fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.badge_participants_counter_color)));
0
Joolah

Mit dieser oben erwähnten Methode: getColor (context, R.color.your_color); Es ist nicht klar, wie man den "Kontext" erhält. Es wird nicht funktionieren, wenn ich nur den Kontext in meinem Fall Android Studio 3.2 anführe. Ich finde, das funktioniert bei mir. .setTextColor (Color.RED).

0
Harry