2016-08-09 9 views
1

Ich bemerkte kürzlich, dass ein VerfahrenWas bedeutet "die zurückgegebene Farbe wird für das angegebene Kontextthema angepasst"?

Context.getResources.getColor(int) 

seit API sollte stattdessen 23. Ein veraltet sagen

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

Die docs darüber verwenden:

int getColor (Context Kontext , int id) Gibt eine zugeordnete Farbe mit einer bestimmten Ressourcen-ID zurück. Ab M wird die zurückgegebene Farbe wird für das angegebene Context-Thema formatiert.

Aber was bedeutet es, dass eine Farbe für ein bestimmtes Thema gestylt wird. Ist keine Farbe? Eine Konstante? Vordefinierte Farben werden in Themen verwendet. Wie kann es gestylt werden?

+0

Wie es der Zufall wollte, hat Alex Lockwood vor ein paar Tagen einen Artikel darüber veröffentlicht: http://www.androiddesignpatterns.com/2016/08/contextcompat-getcolor-getdrawable.html –

Antwort

2

Aus der Dokumentation für Resources-int getColor (int id, Resources.Theme theme):

Gibt eine Thema-Farbe ganze Zahl mit einer ID bestimmten Ressource zugeordnet ist. Wenn die Ressource eine komplexe ColorStateList enthält, wird die Standardfarbe aus der Gruppe zurückgegeben.

So ist das Ressource-ID mehr als nur eine einfache Farbe sein kann, könnte es so etwas wie dies:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" 
      android:color="@color/sample_focused" /> 
    <item android:state_pressed="true" 
      android:state_enabled="false" 
      android:color="@color/sample_disabled_pressed" /> 
    <item android:state_enabled="false" 
      android:color="@color/sample_disabled_not_pressed" /> 
    <item android:color="@color/sample_default" /> 
</selector> 

in diesem Fall die Farbe wäre @color/sample_default zurückgegeben.

Aber wenn man will Attribut für die Farben, so etwas wie diese

<item android:color="?attr/sample_default_color" /> 

verwenden, würden Sie den Attributwert innerhalb des Themas, um zugreifen müssen, um vollständig den Farbwert zu lösen.

Laut Alex Lockwood's blog post sind diese Ressourcen nicht an ein Design gebunden. Wenn Sie die alte Methode mit einer Farbstatusliste aufrufen, die Attribute verwendet, wird eine Ausnahme ausgelöst. Vor Marshmallow konnten Sie aufgrund dieser Einschränkung keine Attribute in Farbzustandslisten verwenden.

+0

Vielen Dank. Aber ist es nicht so, dass wir in Zustandslisten-Selektoren keine Attribute verwenden können, nur feste Farben? Aber, Sie könnten dort einen Punkt haben. Ich werde ein bisschen länger warten, wenn etwas anderes kommt. –

+0

Sie können tatsächlich Attribute für die Farbwerte verwenden. –

+0

Es war meine Erfahrung, dass Sie Attribute für Farbwerte in Zustandslistenselektoren nicht verwenden können. Ich versuchte es. Auf älteren Versionen und Support-Bibliothek. Also ich denke, das ist etwas Neues in neueren Apis. Daumen hoch. –