535 Stimmen

Wie kann ich color-int von color resource erhalten?

Gibt es eine Möglichkeit, eine Farbe-int von einer Farbe Ressource zu erhalten?

Ich versuche, die einzelnen roten, blauen und grünen Komponenten einer in der Ressource (R.color.myColor) definierten Farbe zu erhalten, damit ich die Werte von drei Suchleisten auf ein bestimmtes Niveau setzen kann.

1077voto

sat Punkte 38228

Sie können verwenden:

getResources().getColor(R.color.idname);

Hier erfahren Sie, wie Sie benutzerdefinierte Farben definieren können:

http://sree.cc/google/Android/defining-custom-colors-using-xml-in-Android

EDIT(1): Seit getColor(int id) es Abgelehnt Jetzt muss dies genutzt werden:

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

(hinzugefügt in Unterstützungsbibliothek 23)

EDIT(2):

Der unten stehende Code kann sowohl vor als auch nach Marshmallow (API 23) verwendet werden

ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme

ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme

9 Stimmen

Was ist mit Android.R.color.some_color :-(

19 Stimmen

@Blundell ähh, ich weiß nicht, ob Sie es jetzt brauchen, aber das funktioniert für android.R.color.some_color zu z.B.: getResources().getColor(android.R.color.holo_blue_bright) (zumindest bei API 17)

0 Stimmen

Wie sieht es mit der Leistung aus? Lohnt es sich, das Ergebnis zwischenzuspeichern, damit ich es nicht jedes Mal nachschlagen muss, oder macht Android das intern?

130voto

Ultimo_m Punkte 4431

Auf der Grundlage des neuen Android-Unterstützungsbibliothek (und ce Update), sollten Sie jetzt aufrufen:

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

Nach Angaben der Dokumentation :

public int getColor (int id)

Diese Methode wurde veraltet in API-Stufe 23 . Verwenden Sie stattdessen getColor(int, Theme)

Es ist die gleiche Lösung für getResources().getColorStateList(id) :

Sie müssen es so ändern:

ContextCompat.getColorStateList(getContext(),id);

EDIT 2019

Betreffend ThemeOverlay den Kontext der nächstgelegenen Ansicht verwenden:

val color = ContextCompat.getColor(
  closestView.context,
  R.color.name.color
)

Auf diese Weise erhalten Sie die richtige Farbe, die auf Ihrem ThemeOverlay basiert.

Dies ist vor allem dann erforderlich, wenn Sie für dieselbe Aktivität verschiedene Themen verwenden, z. B. dunkles/helles Thema. Wenn Sie mehr über Themes und Styles erfahren möchten, empfehlen wir Ihnen diesen Vortrag: Entwicklung von Themen mit Stil

Nick Butcher - Droidcon Berlin - Developing Themes with Style

11 Stimmen

Für diejenigen, die sich fragen, was sie als Thema in die neue Methode eingeben sollen, Theme kann als Null übergeben werden, also rufen Sie einfach getColor(R.color.my_color, null) wenn Sie sich nicht sicher sind, welches Thema Sie angeben sollen.

0 Stimmen

Hmm... das sagen alle, aber ich kann es nicht zum Laufen bringen. Muß ich den Kontext initialisieren? Derzeit erhalte ich "kann das Symbol 'context' nicht auflösen".

0 Stimmen

Um sicher zu gehen, dass Sie es richtig machen, versuchen Sie es innerhalb der onCreate der Aktivität, als zu erhalten Kontext müssen Sie getContext() oder einfach "this" aufrufen

43voto

Suragch Punkte 420096

Definieren Sie Ihre Farbe

Werte/Farbe.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- color int as #AARRGGBB (alpha, red, green, blue) -->
    <color name="orange">#fff3632b</color>
    ...
    <color name="my_view_color">@color/orange</color>

</resources>

Die Farbe int abrufen und einstellen

int backgroundColor = ContextCompat.getColor(context, R.color.my_view_color);
// Color backgroundColor = ... (Don't do this. The color is just an int.)

myView.setBackgroundColor(backgroundColor);

Siehe auch

1 Stimmen

Können Sie nur verwenden getResources() in einem Activity o Fragment ?

2 Stimmen

@Zapnologica, siehe die Antworten auf diese Frage für Überlegungen zur Verwendung von getResources() außerhalb einer Aktivität oder eines Fragments.

1 Stimmen

@Zapnologica no. getResources() ist auch als öffentliche API für alles, was Context implementiert, und auch für Views verfügbar.

12voto

geckoflume Punkte 190

Ich habe einen einfacheren Weg gefunden, der auch funktioniert:

Color.parseColor(getString(R.color.idname);

2 Stimmen

Interessant, ich wusste nicht, dass man die Farbe auf diese Weise als Zeichenkette erhalten kann. Ich glaube nicht, dass es einfacher ist, aber es ist interessant

11voto

Khemraj Sharma Punkte 52006

Beste Annäherung

Wie @sat antwortet, ist ein guter Ansatz, um Farbe zu erhalten

ResourcesCompat.getColor(getResources(), R.color.your_color, null);

oder verwenden Sie den unteren Weg, wenn Sie keinen Zugang zu getResources() Methode.

Context context  = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);

Was ich tue, ist

public void someMethod(){
    ...
    ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}

Es ist sehr einfach, es überall in Ihrer App zu verwenden! Sogar in der Util-Klasse oder einer anderen Klasse, in der Sie weder Context noch getResource() haben.

Problem (Wenn Sie keinen Kontext haben)

いつ Sie haben keine Context Zugang wie eine Methode in Ihrem Util clase.

Nehmen Sie die folgende Methode ohne Kontext an.

public void someMethod(){
    ...
    // can't use getResource() without Context.
}

Jetzt werden Sie passieren Context als Parameter in dieser Methode und verwenden getResources().

public void someMethod(Context context){
    ...
    context.getResources...
}

Hier ist also ein Bonus einzigartige Lösung mit dem Sie von überall aus auf Ressourcen zugreifen können, wie Util class . hinzufügen Resources zu Ihrem Application Klasse oder erstellen Sie eine, wenn sie nicht vorhanden ist.

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static App mInstance;
    private static Resources res;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        res = getResources();
    }

    public static App getInstance() {
        return mInstance;
    }

    public static Resources getResourses() {
        return res;
    }

}

Fügen Sie ein Namensfeld zu Ihrem manifest.xml <application Tag. (Falls nicht bereits hinzugefügt)

<application
        android:name=".App"
        ...
        >
        ...
    </application>

Jetzt sind Sie startklar. Verwenden Sie ResourcesCompat.getColor(App.getRes(), R.color.your_color, null); überall in der App.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X