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.

9voto

Blasanka Punkte 17872

Wenn Ihr derzeitiges min. API-Stufe 23 ist, können Sie einfach getColor() wie wir sie für getString() :

//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()

Wenn Sie unterhalb der API-Ebene wollen 23 verwenden Sie einfach dies:

textView.setTextColor(getResources().getColor(R.color.green));

Aber beachten Sie, dass getResources().getColor() ist in der API-Stufe veraltet 23 . In diesem Fall ersetzen Sie den obigen Text durch:

textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`

ContextCompat : Hilfsmittel für den Zugriff auf Funktionen in Context

Wenn Sie möchten, können Sie die Einschränkung mit SDK_INT wie unten:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    textView.setTextColor(getColor(R.color.green));
} else {
    textView.setTextColor(getResources().getColor(R.color.green));
}

6voto

ninjachippie Punkte 390

Ich habe aktualisiert und verwende ContextCompat.getColor(context, R.color.your_color); aber manchmal (auf einigen Geräten/Android-Versionen. Ich bin mir nicht sicher) verursacht das eine NullPointerExcepiton.

Damit es auf allen Geräten/Versionen funktioniert, greife ich also auf die alte Methode zurück, im Falle eines Null-Zeigers.

try {
    textView.setTextColor(ContextCompat.getColor(getActivity(), R.color.text_grey_dark));
}
catch(NullPointerException e) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        textView.setTextColor(getContext().getColor(R.color.text_grey_dark));
    }
    else {
        textView.setTextColor(getResources().getColor(R.color.text_grey_dark));
    }
}

0 Stimmen

Warum nicht in allen Fällen die alte Version verwenden, oder, wenn Sie die Version ohnehin überprüfen, die neue API verwenden Resources.getColor(int, Theme) wenn Sie können? Sie sollten keine Laufzeitausnahmen abfangen.

0 Stimmen

Ich nehme an, es ist eine Zwangsstörung. ContextCompat, scheint mir die zukunftssichere Art und Weise zu sein, und daher der richtige Weg. Mein Ansatz ist also, es auf die richtige Weise zu tun. Und wenn das nicht klappt (auf alten Geräten oder was auch immer), mach es auf die alte Art. Warum sollte ich keine Ausnahmen zur Laufzeit abfangen?

2voto

ataulm Punkte 14775

Für weitere Informationen zu einem anderen Anwendungsfall, der dazu beitragen kann, dass diese Frage in den Suchergebnissen auftaucht, wollte ich Alpha auf eine in meinen Ressourcen definierte Farbe anwenden.

Mit der richtigen Antwort von @sat:

int alpha = ... // 0-255, calculated based on some business logic
int actionBarBackground = getResources().getColor(R.color.actionBarBackground);
int actionBarBackgroundWithAlpha = Color.argb(
        alpha,
        Color.red(actionbarBackground),
        Color.green(actionbarBackground),
        Color.blue(actionbarBackground)
);

1voto

indrajeet jyoti Punkte 405
ContextCompat.getColor(context, R.color.your_color);

in Tätigkeit

ContextCompat.getColor(actvityname.this, R.color.your_color);

bruchstückhaft

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

zum Beispiel:

tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))

0voto

Confuse Punkte 5286

Der Zugriff auf Farben aus einer Nicht-Aktivitätsklasse kann schwierig sein. Eine der Alternativen, die ich gefunden habe, war die Verwendung von enum . enum bietet eine große Flexibilität.

public enum Colors
{
  COLOR0(0x26, 0x32, 0x38),    // R, G, B
  COLOR1(0xD8, 0x1B, 0x60),
  COLOR2(0xFF, 0xFF, 0x72),
  COLOR3(0x64, 0xDD, 0x17);

  private final int R;
  private final int G;
  private final int B;

  Colors(final int R, final int G, final int B)
  {
    this.R = R;
    this.G = G;
    this.B = B;
  }

  public int getColor()
  {
    return (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
  }

  public int getR()
  {
    return R;
  }

  public int getG()
  {
    return G;
  }

  public int getB()
  {
    return B;
  }
}

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