Programmatisch einen Support Vector tönen

Android Studio Version 2.1, Gradle-Version 2.1.0, bitte korrigieren Sie mich, wenn Sie auf Fehlinterpretationen stoßen:)

Ich bin verwirrt über Unterstützungsvektoren in der Unterstützungsbibliothek 23.3.0. Insbesondere möchte ich programmgesteuert eine Bildschaltfläche tönen, deren src definiert ist, ist ein Vektor, der gezeichnet werden kann. Soweit ich das beurteilen kann, ist dies auf Pre-Lollipop jetzt nicht möglich.

Ich habe einige verwandte Beiträge zu den Änderungen gelesen: 23.2.0 Ankündigung und Änderungen:

Ab Android Support Library 23.3.0 können Support Vector Drawables nur über die App srcCompat oder setImageResource () geladen werden.

Bedeutet dies, dass Vektor-XMLs nur vor Lollipop über srcCompat oder setImageResource () verwendet werden können und daherkann nicht dynamisch getönt werden?

Hier ist meine grundlegende Bildschaltfläche:

<ImageButton
    android:id="@+id/nav_header_exit_community_button"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:background="@null"/>

Works nur für Lollipop und höher:

    Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp);
    DrawableCompat.setTint(bg, headerTitleColor);
    exitButton.setImageDrawable(bg);

Attempting dieser Pre-Lollipop wirft:android.content.res.Resources$NotFoundException: File res/drawable/ic_exit_to_app_24dp.xml from drawable resource ID #0x7f0200bf

Auch funktioniert auf Lollipop und höher nur

    Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp);
    DrawableCompat.setTint(bg, headerTitleColor);
    exitButton.setImageResource(R.drawable.ic_exit_to_app_24dp);

Dies wirft den gleichen Fehler auf Pre-Lollipop.

Allerdings, wenn ich @ entfernvectorDrawables.useSupportLibrary = true wie erwähntvon Ian Lake hier, mit der Absicht, dass die Build-Tools automatisch PNGs für Geräte vor Lollipop generieren,die pngs tönen nicht auf pre-lollipop, also bin ich wieder auf Platz eins.

Ich habe auch versucht, den Vektor über @ anzugebsrcCompat und programmgesteuert abrufen, aber ich glaube nicht, dass ich das geschafft habe, obwohl es auf Post-Lollipop funktioniert, wenn der Vektor mit @ angegeben wirsrc stattdessen

So scheint die Situation für 23.3.0 zu sein:

Post-Lollipop:src undsrcCompat Vektoren akzeptieren, nursrc kann aus der Ansicht als Zeichenelement zum programmgesteuerten Abtönen abgerufen werden. Das Referenzieren von Vektoren im Code ist mit getDrawable möglich und kann getönt werden.

Pre-Lollipop: srcCompat kann nur Vektoren akzeptieren und kann nicht programmgesteuert aus der Ansicht zum Abtönen abgerufen werden.setImageResource kann Vektoren akzeptieren, aber nur wennvectorDrawables.useSupportLibrary = false und Tönen funktioniert nicht. Ebenso ist es nicht möglich, Vektoren im Code zu referenzieren, es sei denn,vectorDrawables.useSupportLibrary = false und Tönen funktioniert nicht.

Arbeiten auf allen Versionen mit pngs:

   Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_nav_exit_community);
   DrawableCompat.setTint(bg, headerTitleColor);
   exitButton.setImageDrawable(bg);

Nachtrag

Diese Technik funktioniert auch bei Post-Lollipop, aber wie die anderen bei Pre-Lollipop bekomme ich das Zeichen, aber keine Tönung:

    Drawable bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null);
    DrawableCompat.setTint(bg, headerTitleColor);
    exitButton.setImageDrawable(bg);

Art der Lösung:

Dank an John's answer bis jetzt kann ich mir zum Abtönen eines Hilfsvektors nur einen Farbfilter überlegen - das bedeutet, dasDrawableCompat.setTint()ie @ -Funktion ist für mich anscheinend nicht funktionsfähig, wenn es sich bei dem betreffenden Drawable um einen Support-Vektor handelt. Ich bin mir nicht sicher, ob dies ein legitimer Fehler ist, ein erwartetes Verhalten oder ob ich einfach etwas falsch mache!

Hier ist die Lösung, mit der ich mich im Moment beschäftige:

    Drawable bg;
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null);
        exitButton.setColorFilter(headerTitleColor, PorterDuff.Mode.MULTIPLY);
    }
    else {
        bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp);
        DrawableCompat.setTint(bg, headerTitleColor);
    }
    exitButton.setImageDrawable(bg);

Antworten auf die Frage(4)

Ihre Antwort auf die Frage