2017-09-06 18 views
0

Ich habe ein benutzerdefiniertes Layout, das benutzerdefinierte Attribute, von denen eine Farbe ist. Ich habe Benutzer setzen dieses Attribut auf eine Farbe (keine gemeinsame Farbe) und ich benutze TypedArray getColor-Methode, um diese Farbe abrufen und setzen Sie es auf eine ganze Zahl (wenn ich diese int drucken, ist es negativ). Lassen Sie uns sagen, dass ich etwas tun:Android - Farbe aus benutzerdefinierten Attribut zurückgegeben einen anderen Wert als die gleiche Farbe aus colors.xml

int myColor; 
TypedArray ta = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, 0, 0); 
myColor = ta.getColor(R.styleable.MyView_myColor, -1); 

if (myColor == R.color.special_shade_of_yellow) { 
    mySpecialMethod() 
} 

die wir nun ein Benutzer sagen das Attribut setzt R.color.special_shade_of_yellow zu sein. Der if-Block wird jedoch niemals durchlaufen, so dass mySpecialMethod() niemals aufgerufen wird. Aus irgendeinem Grund ist myColor ein negativer Wert, während R.color.special_shade_of_yellow dies nicht ist. Warum geben sie nicht dieselben Werte zurück? Vielen Dank!

Antwort

0

Farben in Android können etwas verwirrend sein. Sie haben Farbressourcenkennungen (wie R.color.my_color) und Sie haben Farbwerte (wie 0xff0000), aber beide werden durch einen int Wert dargestellt.

TypedArray.getColor() gibt einen Farbwert zurück, d. H. Eine echte Farbe, die Sie direkt auf eine Ansicht anwenden können. Daher ist es nicht etwas, was Sie mit R.color.special_shade_of_yellow mit einem einfachen == vergleichen möchten.

Versuchen Sie stattdessen:

if (myColor == ContextCompat.getColor(getContext(), R.color.special_shade_of_yellow)) { 
    ... 
} 

ContextCompat.getColor() wird lösen Ihre Farb Resource Identifier (hier R.color.special_shade_of_yellow) zu einem Farbwert, und dann können Sie eine == Vergleich durchführen.

+0

Wow, gut zu wissen! Das war die Lösung. Vielen Dank! – Elise

Verwandte Themen