2016-03-29 1 views
4

同じIDを持つすべての新しいドローアブルを濃淡着色されている場合、ContextCompat.getDrawable(context, R.drawable.bg_chat_bubble)へのすべての呼び出しは、オリジナル信号の代わりに着色画像を返します。チャットを終了して全く別のチャットを開いても、そこにある気泡には前回の色合いがあります。アプリを殺すだけで正しい色を復元できます。最初の色合いまで...DrawableCompat setTintは、私はいくつかの状況で色付けしたい泡をチャットしている

setTintを呼び出した後に、ティントブランチ内に直接bubbleDrawable = ContextCompat.getDrawable(context, R.drawable.bg_chat_bubble)を直接設定しても、オリジナルではなく色付きの画像が得られます。

私もgetResources().getDrawable(R.drawable.bg_chat_bubble)を試しましたが、結果は同じです。ですから、いったん描画可能な再描画に色合いを使いたいと思ったら、そのリソースの色合いを常に設定しなければなりません。それ以外の場合は予測できない結果が得られます。

これは、Android 5.1(おそらく他のアプリ)でも、appcompat-v7:23.2.+appcompat-v7:23.1.+で起きています。これは既知のバグですか、何か間違っていますか?

+0

色を設定する前にドロアブルを変更しようとしました。 – pskink

+0

ありがとう、これは完璧に動作します。しかし、メモリ消費はどうですか?あなたのコメントを答えにして、私はそれを受け入れます。 – shelll

+0

新しい小さな「共通の状態」を作成するだけなので、大きな問題ではありません – pskink

答えて

9

あなたが必要とするすべての色合いを設定する前に描画可能に変異させることがある。

bubbleDrawable.mutate() 

Drawable.mutate

これは描画可能な可変ください。この操作は元に戻すことはできません。 変更可能なドロウアブルは、他の ドロウアブルとその状態を共有しないことが保証されています。これは、リソースからロードされたドロウアブルのプロパティー を変更する必要がある場合に特に便利です。デフォルトでは、同じリソースからロードされたすべての描画可能ファイル が共通の状態を共有します。 1つのインスタンスの状態を変更した場合、他のすべてのインスタンスは同じ変更を で受信します。このメソッドを変更可能なDrawableで呼び出すと、 は無効になります。

関連する問題