Farbwert programmgesteuert abrufen, wenn es sich um eine Referenz (Design) handelt

Lesezeit: 5 Minuten

Bedenken Sie:

styles.xml

<style name="BlueTheme" parent="@android:style/Theme.Black.NoTitleBar">
    <item name="theme_color">@color/theme_color_blue</item>
</style>

attrs.xml

<attr name="theme_color" format="reference" />

color.xml

<color name="theme_color_blue">#ff0071d3</color>

Also die Themenfarbe wird durch das Thema referenziert. Wie kann ich die theme_color (Referenz) programmgesteuert abrufen? Normalerweise würde ich verwenden getResources().getColor() aber nicht in diesem Fall, weil darauf verwiesen wird!

Farbwert programmgesteuert abrufen wenn es sich um eine Referenz Design
Emanuel Möcklin

Dies sollte die Arbeit erledigen:

TypedValue typedValue = new TypedValue();
Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.theme_color, typedValue, true);
@ColorInt int color = typedValue.data;

Stellen Sie außerdem sicher, dass Sie das Design auf Ihre Aktivität anwenden, bevor Sie diesen Code aufrufen. Verwenden Sie entweder:

android:theme="@style/Theme.BlueTheme"

in Ihrem Manifest oder Anruf (bevor Sie anrufen setContentView(int)):

setTheme(R.style.Theme_BlueTheme)

in onCreate().

Ich habe es mit deinen Werten getestet und es hat einwandfrei funktioniert.

  • Wie auch immer, mit Ihrer Lösung bekomme ich eine 0-Wert-Farbe (TypedValue {t = 0x0/d = 0x0}) … Ich verwende kein Deklarations-Styleable, nur einen Verweis auf die Farbe

    – Seraphims

    24. Juni 2013 um 15:10 Uhr


  • Wenn Sie das Thema nicht auf die Aktivität anwenden möchten, können Sie eine erstellen ContextThemeWrapper Verwenden Sie die Themen-ID und rufen Sie dann das Thema daraus ab.

    –Ted Hopp

    19. Mai 2016 um 20:09 Uhr

  • Diese Methode funktioniert in Android X (Materialdesign)

    – Schwarzblind

    3. September 2019 um 8:32 Uhr

  • Diese Methode funktioniert nicht, wenn theme_color Referenzen a ColorStateList: Sie können diese Lösung verwenden, um die Standardfarbe zu erhalten oder AppCompatResources.getColorStateList(context, typedValue.resourceId) bekommen ColorStateList Objekt.

    – gmk57

    9. März 2020 um 21:56 Uhr


  • Jetzt eingebaut. Folgendes ist äquivalent: MaterialColors.getColor(context, R.attr.colorError, Color.GRAY)

    – Mike Hanafey

    14. August 2020 um 23:26 Uhr

1647154988 592 Farbwert programmgesteuert abrufen wenn es sich um eine Referenz Design
Bri6ko

Um die akzeptierte Antwort zu ergänzen, wenn Sie Kotlin verwenden.

@ColorInt
fun Context.getColorFromAttr(
    @AttrRes attrColor: Int,
    typedValue: TypedValue = TypedValue(),
    resolveRefs: Boolean = true
): Int {
    theme.resolveAttribute(attrColor, typedValue, resolveRefs)
    return typedValue.data
}

und dann in Ihrer Aktivität können Sie tun

textView.setTextColor(getColorFromAttr(R.attr.color))

  • oook, danke für die “Einbindung”. Ich benutze kein Kotlin, aber es ist interessant.

    – Seraphims

    27. Juli 2018 um 16:05 Uhr

  • Nun, es macht TypedValue für die Außenwelt sichtbar. Und für Farben möchten Sie immer referenzielle Deklarationen auflösen, also habe ich Folgendes: @ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = TypedValue().let { theme.resolveAttribute(attribute, it, true); it.data } (hier schlecht formatiert, aber es ist ok)

    – Milosmen

    17. Februar 2019 um 13:09 Uhr


  • Die Nutzung wäre wie folgt: val errorColor = context.getThemeColor(R.attr.colorError)

    – Milosmen

    17. Februar 2019 um 13:11 Uhr

  • Ein universellerer Weg, der auch den Standardwert für a abruft ColorStateList: @ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = obtainStyledAttributes(intArrayOf(attribute)).use { it.getColor(0, Color.MAGENTA) } (von Nick Metzger)

    – gmk57

    11. April 2020 um 15:35 Uhr

  • Ultimativer Weg, der das Ganze zurückholt ColorStateListauch wenn es auf andere Designattribute verweist: fun Context.getThemeColor(@AttrRes attribute: Int): ColorStateList = TypedValue().let { theme.resolveAttribute(attribute, it, true); AppCompatResources.getColorStateList(this, it.resourceId) } (einzelne Farben werden in a ColorStateList zu).

    – gmk57

    11. April 2020 um 16:22 Uhr

Wir können die von der Material Design-Bibliothek bereitgestellte Utility-Klasse verwenden:

int color = MaterialColors.getColor(context, R.attr.theme_color, Color.BLACK)

HINWEIS: Color.BLACK ist die Standardfarbe für den Fall, dass das Attribut dem u

  • Die beste Antwort von allen

    – Ismail Iqbal

    31. Dezember 2020 um 20:46 Uhr

  • Sicherlich ist die Verwendung der Hilfsklasse MaterialColors der empfohlene Weg. Es ist sogar möglich, eine Themenfarbbasis für eine Ansicht zu erhalten: val primaryColor = MaterialColors.getColor(view, R.attr.colorPrimary)

    – Android-iPhone

    19. Februar 2021 um 11:17 Uhr

  • Dies sollte jetzt im Jahr 2021 eine akzeptierte Antwort sein

    – die Korovay

    8. April 2021 um 13:54 Uhr

  • In meinem Fall funktioniert beispielsweise “android.R.attr.textColorSecondary” nicht. Es ist einfach durchsichtig. Aber die Standardfarbe wird nicht verwendet, also stecke ich bei diesem Problem fest. Irgendeine Hilfe?

    – zanke

    8. Februar um 10:46 Uhr

  • @tzanke überprüfe deine Stile, mby du hast es nicht erklärt android:textColorSecondarynicht textColorSecondary. Stellen Sie außerdem sicher, dass der Kontext diesen Stil angewendet hat

    – Akbolat SSS

    8. Februar um 14:00 Uhr

Farbwert programmgesteuert abrufen wenn es sich um eine Referenz Design
Engel Solis

Das hat bei mir funktioniert:

int[] attrs = {R.attr.my_attribute};
TypedArray ta = context.obtainStyledAttributes(attrs);
int color = ta.getResourceId(0, android.R.color.black);
ta.recycle();

wenn du den Hexstring rausholen willst:

Integer.toHexString(color)

1647154989 169 Farbwert programmgesteuert abrufen wenn es sich um eine Referenz Design
Rishad Baniya

2021/January/8

Wenn Sie Farbe aus Designattributen erhalten möchten, führen Sie die folgenden Schritte aus.

Erstellen Sie eine Variable my_color und speichern Sie die Farbe aus den Themenattributen als

val my_color = MaterialColors.getColor(<VIEWOBJECT>, R.attr.<YOUATRRIBUTENAME>)

Anstelle von <VIEWOBJECT>übergeben Sie ein Ansichtsobjekt, in dem Sie die Farbe verwenden möchten (hinter den Kulissen wird es nur verwendet, um den Kontext als zu erhalten <VIEWOBJECT>.getContext() damit es auf Ressourcen zugreifen kann, dh Themenattributwerte). Anstelle von <YOURATTRIBUTENAME>verwenden Sie den Namen des Attributs, auf das Sie zugreifen möchten

Beispiel 1:

Wenn Sie möchten, dass Farben von Themenattributen aus bestimmten Aktivitäten referenziert werden. Erstellen Sie eine Variable, die ein Ansichtsobjekt darstellt, für das Sie die Farbe verwenden möchten. Hier habe ich eine TextView in meiner Aktivität, ich verweise nur auf ihr Objekt darin textview Variable und übergebe sie an die getColor -Methode und hinter den Kulissen verwendet es dieses Objekt, um nur den Kontext abzurufen, damit es auf Themenattributwerte zugreifen kann

val textview: TextView = findViewById(R.id.mytextview)
val my_color = MaterialColors.getColor(textView, R.attr<YOURATTRIBUTENAME>)

Beispiel 2:

Wenn Sie Farbe aus Designattributen in einer benutzerdefinierten Ansicht erhalten möchten, verwenden Sie einfach,

val my_color = MaterialColors.getColor(this, R.attr.<YOUATRRIBUTENAME>)

In einer benutzerdefinierten Ansicht this bezieht sich auf das Objekt der benutzerdefinierten Ansicht, das eigentlich ein Ansichtsobjekt ist.

1647154990 278 Farbwert programmgesteuert abrufen wenn es sich um eine Referenz Design
Andre Ramón

Fügen Sie dies zu Ihrer build.gradle (App) hinzu:

implementation 'androidx.core:core-ktx:1.1.0'

Und fügen Sie diese Erweiterungsfunktion irgendwo in Ihrem Code hinzu:

@ColorInt
@SuppressLint("Recycle")
fun Context.themeColor(
    @AttrRes themeAttrId: Int
): Int {
    return obtainStyledAttributes(
        intArrayOf(themeAttrId)
    ).use {
        it.getColor(0, Color.MAGENTA)
    }
}

1647154990 265 Farbwert programmgesteuert abrufen wenn es sich um eine Referenz Design
Nikolaus

Wenn Sie mehrere Farben erhalten möchten, können Sie Folgendes verwenden:

int[] attrs = {R.attr.customAttr, android.R.attr.textColorSecondary, 
        android.R.attr.textColorPrimaryInverse};
Resources.Theme theme = context.getTheme();
TypedArray ta = theme.obtainStyledAttributes(attrs);

int[] colors = new int[attrs.length];
for (int i = 0; i < attrs.length; i++) {
    colors[i] = ta.getColor(i, 0);
}

ta.recycle();

996330cookie-checkFarbwert programmgesteuert abrufen, wenn es sich um eine Referenz (Design) handelt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy