0

私は奇妙な問題に遭遇しています... Drawableを色づけるためのコードをいくつか作っていますが、これはVectorアセットのすべてのAndroidバージョン資産。コードは以下の通りです:描画可能な色づきコードはPNGではなくベクターで動作します

public class TintHelper { 

    private Context mContext; 

    public TintHelper(Context context) { 
     mContext = context; 
    } 

    public Drawable getTintedDrawableFromResource(int resourceID, ColorStateList colorStateList) { 
     Drawable original = AppCompatDrawableManager.get().getDrawable(mContext, resourceID); 
     return performTintOnDrawable(original, colorStateList); 
    } 

    private Drawable performTintOnDrawable(Drawable drawable, ColorStateList colorStateList) { 
     Drawable tinted = DrawableCompat.wrap(drawable); 
     DrawableCompat.setTintList(tinted, colorStateList); 
     return tinted; 
    } 
} 

私はベクトル資産のリソースIDを指定すると、コードは完璧に動作し、画像が押されたときに色を付け、私は定期的にPNGを使用する場合、適用される一切の色合いはありませんアイコンが押された。理由がわからない理由がある場合は、両方の資産タイプをサポートする代替方法を投稿してください。

ありがとうございます!

+0

'appcompat-v7' /' support-v4'のどのバージョンをお使いですか?最新のもの? 24.2.0? – pskink

+0

@pskink 24.2.1。ソリューションについては私の答えを参照してください。 – privatestaticint

+0

それはちょうど24.2.0と働く、私は(ダブル)は、カスタムビューの必要はありません – pskink

答えて

0

自分の環境でPNGの作業です。このような

セット:

int resourceID = R.drawable.ic_launcher; 
TintHelper tintHelper = new TintHelper(this); 
Drawable drawable = tintHelper.getTintedDrawableFromResource(resourceID, 
     ContextCompat.getColorStateList(this, R.color.colors)); 

ImageView imageView = (ImageView) findViewById(R.id.image); 
imageView.setImageDrawable(drawable); 

colors.xmlは、このようなものです:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" android:color="@android:color/holo_red_dark"/> 
    <item android:state_selected="true" android:color="@android:color/holo_red_dark"/> 
    <item android:state_pressed="true" android:color="@android:color/holo_red_dark"/> 
    <item android:color="@android:color/white"/> 
</selector> 
+1

ありがとう、それでも私のために働いていなかった。私は私の答えに私の修正を概説しました。 – privatestaticint

0

私は問題を発見しました。基本的に、DrawableCompat.setTintList()は、Android 21以上では期待どおりに動作しません。これは、状態が変更されたときに、その実装がinvalidate()を呼び出さないためです。詳細はbug reportで読むことができます。

すべてのプラットフォームおよびすべてのリソースタイプのために働いて、この着色コードを取得するには、私は以下に示すように、カスタムImageViewのクラスを作成するために必要な:

public class StyleableImageView extends AppCompatImageView { 

    public StyleableImageView(Context context) { 
     super(context); 
    } 

    public StyleableImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public StyleableImageView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    // This is the function to override... 
    @Override 
    protected void drawableStateChanged() { 
     super.drawableStateChanged(); 
     invalidate(); // THE IMPORTANT LINE 
    } 
} 

うまくいけば、これは、似たような状況に対処しなければならなかった人を助けます。

関連する問題