Wenn ich Drawables aus dem AppCompat
für meine Toolbar
Menüpunkte Bibliothek die Tönung wie erwartet. So was:
<item
android:id="@+id/action_clear"
android:icon="@drawable/abc_ic_clear_mtrl_alpha" <-- from AppCompat
android:title="@string/clear" />
Aber wenn ich meine eigenen Drawables benutze oder sogar die Drawables aus dem kopiere AppCompat
Bibliothek in mein eigenes Projekt , wird es überhaupt nicht .
<item
android:id="@+id/action_clear"
android:icon="@drawable/abc_ic_clear_mtrl_alpha_copy" <-- copy from AppCompat
android:title="@string/clear" />
Gibt es eine besondere Magie in den AppCompat
Toolbar
nur Farbtönen aus dieser Bibliothek? Gibt es eine Möglichkeit, dies mit meinen eigenen Drawables zum Laufen zu bringen?
Ausführen auf einem API Level 19-Gerät mit compileSdkVersion = 21
und aus targetSdkVersion = 21
und verwenden Sie auch alles vonAppCompat
abc_ic_clear_mtrl_alpha_copy
ist eine exakte Kopie der abc_ic_clear_mtrl_alpha
PNG vonAppCompat
Bearbeiten:
Die Tönung basiert auf dem Wert, den ich festgelegt habe android:textColorPrimary
in meinem Thema festgelegt habe.
Z.B <item name="android:textColorPrimary">#00FF00</item>
würde mir eine grün gefärbte Farbe geben.
Screenshots
Tönung funktioniert erwartungsgemäß mit Drawable von AppCompat
Tönung funktioniert nicht mit aus AppCompat kopiertem Zeichen
Antworten:
Wenn Sie sich den Quellcode des TintManager in AppCompat ansehen, werden Sie Folgendes sehen:
Was ziemlich genau bedeutet, dass sie bestimmte Ressourcen-IDs auf der Whitelist haben, die getönt werden sollen.
Aber ich denke, Sie können immer sehen, wie sie diese Bilder tönen und dasselbe tun. Es ist so einfach, wie den ColorFilter auf ein Zeichenelement zu setzen.
quelle
Nach der neuen Support-Bibliothek v22.1 können Sie Folgendes verwenden:
quelle
setColorFilter()
viel besser ist.Das Einstellen von a
ColorFilter
(Farbton) auf aMenuItem
ist einfach. Hier ist ein Beispiel:Der obige Code ist sehr hilfreich, wenn Sie verschiedene Themen unterstützen möchten und keine zusätzlichen Kopien nur für die Farbe oder Transparenz haben möchten.
Klicken Sie hier, um eine
ColorFilter
Hilfsklasse für alle Zeichen in einem Menü festzulegen, einschließlich des Überlaufsymbols.In
onCreateOptionsMenu(Menu menu)
nur AnrufMenuColorizer.colorMenu(this, menu, color);
nach dem Menü und voila Aufblasen; Ihre Symbole sind getönt.quelle
app:iconTint
Das Attribut wird inSupportMenuInflater
der Support-Bibliothek implementiert (mindestens in 28.0.0).Erfolgreich mit API 15 und höher getestet.
Menü Ressourcendatei:
(In diesem Fall
?attr/appIconColorEnabled
war ein benutzerdefiniertes Farbattribut in den Themen der App enthalten, und die Symbolressourcen waren Vektorzeichnungen.)quelle
android:iconTint
undandroid:iconTintMode
nicht Arbeit, sondern voran mitapp:
stattandroid:
wirkt wie ein Zauber (auf meinem eigenen Vektor Drawables, API> = 21)SupportMenuInflater
keine benutzerdefinierte Logik angewendet wird, wenn das Menü nichtSupportMenu
ähnlich istMenuBuilder
, sondern nur auf normal zurückgegriffen wirdMenuInflater
.AppCompatActivity.startSupportActionMode(callback)
und die entsprechenden Support-Implementierungen vonandroidx.appcompat
an den Rückruf übergeben.Ich persönlich habe diesen Ansatz über diesen Link bevorzugt
Erstellen Sie ein XML-Layout mit folgenden Elementen:
und verweisen Sie auf dieses Zeichen aus Ihrem Menü:
quelle
bitmap
. Es gibt andere Möglichkeiten, Vektoren zu färben. Vielleicht könnte hier auch jemand eineDie meisten Lösungen in diesem Thread verwenden entweder eine neuere API oder Reflection oder verwenden eine intensive Ansichtssuche, um zum aufgeblasenen zu gelangen
MenuItem
.Es gibt jedoch einen eleganteren Ansatz, um dies zu tun. Sie benötigen eine benutzerdefinierte Symbolleiste, da Ihr Anwendungsfall "Benutzerdefinierten Farbton anwenden" mit der öffentlichen Styling- / Theming-API nicht gut funktioniert.
Stellen Sie einfach sicher, dass Sie Ihren Aktivitäts- / Fragmentcode eingeben:
Keine Reflexion, keine Ansichtssuche und nicht so viel Code, oder?
Und jetzt können Sie das Lächerliche ignorieren
onCreateOptionsMenu/onOptionsItemSelected
.quelle
Menu#getItem()
Komplexität in der Symbolleiste O (1), da Elemente in ArrayList gespeichert sind. Was sich von derView#findViewById
Durchquerung unterscheidet (die ich in meiner Antwort als Ansichtssuche bezeichnet habe), deren Komplexität bei weitem nicht konstant ist :-)Hier ist die Lösung, die ich benutze; Sie können es nach onPrepareOptionsMenu () oder dem entsprechenden Ort aufrufen. Der Grund für mutate () ist, wenn Sie die Symbole an mehreren Stellen verwenden. Ohne die Mutation werden sie alle den gleichen Farbton annehmen.
Der Überlauf wird dadurch nicht behoben, aber dafür können Sie Folgendes tun:
Layout:
Stile:
Dies funktioniert ab Appcompat v23.1.0.
quelle