0

So läuft mir ein seltsames Problem ... Ich habe einen Code erstellt, um eine Drawable zu färben, und es funktioniert auf allen Android-Versionen für Vector Assets, aber nicht für reguläre PNG Vermögenswerte. Der Code ist unten:Drawable Tönungscode funktioniert für Vektoren, aber nicht PNGs

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; 
    } 
} 

Wenn ich die Ressourcen-ID eines Vektors Asset angeben, funktioniert der Code perfekt und das Bild getönt ist, wenn sie gedrückt, aber wenn ich eine regelmäßige PNG verwenden, gibt es keine Anwendung Tönung, wenn die Das Symbol ist gedrückt. Wenn jemand Ideen dafür hat, warum dies nicht funktioniert, veröffentlichen Sie eine alternative Methode, die möglicherweise beide Asset-Typen unterstützt.

Vielen Dank im Voraus!

+0

Welche Version von 'appcompat-v7' /' support-v4' verwenden Sie? das Neueste? 24.2.0? – pskink

+0

@pskink 24.2.1. Siehe meine Antwort unten für die Lösung. – privatestaticint

+0

es funktioniert nur mit 24.2.0, ich (doppelt) überprüft, dass keine Notwendigkeit für eine benutzerdefinierte Ansicht – pskink

Antwort

0

Es ist Arbeit für PNG in meiner Umgebung.

Satz wie folgt aus:

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 ist wie folgt:

<?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

danke, aber es war immer noch nicht für mich arbeiten. Ich habe meine Lösung in meiner Antwort beschrieben. – privatestaticint

0

fand ich das Problem. Im Wesentlichen funktioniert DrawableCompat.setTintList() nicht wie erwartet auf Android 21 und höher. Dies liegt daran, dass ihre Implementierung invalidate() nicht aufruft, wenn Statusänderungen vorliegen. Weitere Details finden Sie unter bug report.

diesen Tönungs Code Um für alle Plattformen zu arbeiten und alle Ressourcentypen, die ich brauchte eine benutzerdefinierte Imageview-Klasse zu erstellen, wie unten dargestellt:

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 
    } 
} 

Hoffentlich jemand hilft, die mit einer ähnlichen Situation hatten zu beschäftigen .

Verwandte Themen