Ich möchte 2 auswählbare Themen für meine Anwendung haben. Zu diesem Zweck habe ich einige Attribute wie folgt definiert:
<attr format="color" name="item_background" />
Dann habe ich beide Themen wie folgt erstellt:
<style name="ThemeA">
<item name="item_background">#123456</item>
</style>
<style name="ThemeB">
<item name="item_background">#ABCDEF</item>
</style>
Diese Methode funktioniert hervorragend und ermöglicht mir das einfache Erstellen und Ändern mehrerer Themen. Das Problem ist, dass es anscheinend nur in Ansichten und nicht in Drawables verwendet werden kann .
Das Verweisen auf einen Wert aus einer Ansicht in einem Layout funktioniert beispielsweise wie folgt:
<TextView android:background="?item_background" />
Aber dasselbe in einem Drawable zu tun, bedeutet nicht:
<shape android:shape="rectangle">
<solid android:color="?item_background" />
</shape>
Ich erhalte diesen Fehler beim Ausführen der Anwendung:
java.lang.UnsupportedOperationException: Can't convert to color: type=0x2
Wenn ?item_background
ich keine fest codierte Farbe verwende, funktioniert dies, aber ich kann meine Themen nicht verwenden. Ich habe es auch versucht ?attr:item_background
, aber das gleiche passiert.
Wie könnte ich das machen? Und warum funktioniert es in Ansichten, aber nicht in Drawables? Ich kann diese Einschränkung nirgendwo in der Dokumentation finden ...
Antworten:
Nach meiner Erfahrung ist es nicht möglich, ein Attribut in einer XML-Zeichnung zu referenzieren.
Um Ihr Thema zu erstellen, müssen Sie:
Fügen Sie die gewünschte Farbe direkt mit dem
@color
Tag- oder # RGB-Format in Ihre Zeichnung ein.Erstellen Sie in attrs.xml ein Attribut für Ihre Zeichnung .
Fügen Sie Ihr Zeichen zu Ihrer theme.xml hinzu .
Verweisen Sie mit Ihrem Attribut auf Ihre Zeichnung in Ihrem Layout.
quelle
Ab
lollipop
(API 21) wird diese Funktion unterstützt, siehe https://code.google.com/p/android/issues/detail?id=26251Wenn Sie jedoch auf Geräte ohne Lutscher abzielen, verwenden Sie diese nicht, da sie abstürzen können. Verwenden Sie stattdessen die Problemumgehung in der akzeptierten Antwort.
quelle
Es ist zwar nicht möglich, Stilattribute aus Drawables auf Pre-Lollipop- Geräten zu referenzieren , aber es ist für Farbstatuslisten möglich. Sie können die AppCompatResources.getColorStateList-Methode (Context context, int resId) aus der Android Support Library verwenden. Der Nachteil ist, dass Sie diese Farbstatuslisten programmgesteuert festlegen müssen.
Hier ist ein sehr einfaches Beispiel.
color / my_color_state.xml
Ein Widget, das eine Farbstatusliste benötigt:
Und das Wichtigste:
Nun, nicht der eleganteste oder kürzeste Weg, aber genau das tut die Android Support Library, damit sie auf älteren Versionen (vor Lollipop) von Android funktioniert.
Leider funktioniert die ähnliche Methode für Drawables nicht mit Stilattributen.
quelle
Ich habe die gleiche Frage unter https://stackoverflow.com/a/59467269/3841352 beantwortet, aber ich werde sie auch hier posten:
Ich bin auf dasselbe Problem gestoßen und seit 2019 ist es nicht behoben, sodass Sie kein Attribut in einem Selektor als Zeichenelement referenzieren können. Ich werde die Lösung, die ich für das Problem erhalten habe, teilen, da ich sie hier nicht sehe. Ich habe es im letzten Kommentar des Fehlerberichts gefunden .
Die Problemumgehung besteht im Wesentlichen darin, eine zeichnbare Ressource zu erstellen, die auf den Attributwert verweist.
Um Ihren Fall zu veranschaulichen, wäre die Lösung anstelle von:
Sie würden das? attr / * für eine zeichnbare Ressource ersetzen:
Die Drawables würden definiert als:
drawable / colorPrimaryDrawable
drawable / colorPrimaryDarkDrawable
Ich hoffe es hilft!!
quelle
Wie @marmor sagte, wird dies jetzt von API 21 unterstützt. Für diejenigen, die ältere Versionen von Android unterstützen müssen, können Sie diese Funktion verwenden. Mit der v7-Unterstützungsbibliothek können Sie sie weiterhin für Apps mit einem Mindest-SDK-Level bis zu 7 verwenden.
Die
AppCompatImageView
in der v7 Android Support Library hat eine fehlerfreie Implementierung dieser Funktion. Ersetzen Sie einfach Ihre Verwendung vonImageView
durchAppCompatImageView
.quelle