2016-03-29 12 views
4

ich Blasen haben chatten, die ich in einigen Situationen tönen wollen:DrawableCompat setTint färbt alle neuen Drawables mit der gleichen ID

Drawable bubbleDrawable = ContextCompat.getDrawable(context, R.drawable.bg_chat_bubble); 

if (tint) { 
    bubbleDrawable = DrawableCompat.wrap(bubbleDrawable); 
    DrawableCompat.setTint(bubbleDrawable, bubbleTint); 
} 

Das Problem ist, dass, wenn einmal, dass R.drawable.bg_chat_bubble (es ist ein 9-Patch) war getönt dann alle Anrufe an ContextCompat.getDrawable(context, R.drawable.bg_chat_bubble) gibt das getönte Bild anstelle des Originals zurück. Selbst wenn ich einen Chat schließe und einen völlig anderen Chat öffne, haben die Blasen dort den vorherigen Farbton. Nur das Löschen der App hilft dabei, die richtige Farbe wiederherzustellen. Bis zur ersten Tönung ...

Auch direkt setzen bubbleDrawable = ContextCompat.getDrawable(context, R.drawable.bg_chat_bubble) innerhalb der Tönung Zweig nach dem Aufruf setTint gibt ein getöntes Bild anstelle des Originals.

Ich versuchte auch getResources().getDrawable(R.drawable.bg_chat_bubble), aber das Ergebnis ist das gleiche. Wenn ich also einen Tönung für irgendeine zeichnerische Resuce verwenden möchte, muss ich immer eine Tönung für diese Ressource setzen, sonst bekomme ich unvorhersehbare Ergebnisse.

Dies geschieht auf Android 5.1 (wahrscheinlich auch andere) und mit appcompat-v7:23.2.+ und appcompat-v7:23.1.+. Ist das ein bekannter Fehler oder mache ich etwas falsch?

+0

versuchen Sie, das Zeichen vor der Einstellung der Tönung zu ändern – pskink

+0

@pksink danke, das funktioniert perfekt. aber was ist mit Speicherverbrauch? mach deinen Kommentar eine Antwort und ich werde es akzeptieren. – shelll

+0

es schafft nur einen neuen kleinen "gemeinsamen Zustand", also ist es keine große Sache – pskink

Antwort

9

alles, was Sie brauchen, ist Ihr ziehbar mutieren, bevor Sie den Farbton einstellen:

bubbleDrawable.mutate() 

Drawable.mutate

Machen Sie dieses ziehbar wandelbar. Dieser Vorgang kann nicht rückgängig gemacht werden. Ein veränderbarer Zeichensatz garantiert seinen Zustand nicht mit anderen Zeichen teilen. Dies ist besonders nützlich, wenn Sie die Eigenschaften der aus Ressourcen geladenen Zeichen ändern müssen. Standardmäßig teilen alle Zeichenausdrücke Instanzen, die von derselben Ressource geladen werden, einen gemeinsamen Status; Wenn Sie den Status einer Instanz ändern, erhalten alle anderen Instanzen die gleiche Änderung. Wenn Sie diese Methode auf eine veränderbare Drawable anwenden, wird keine Wirkung haben.