2015-05-23 3 views
7

Ich benutze die Support-Bibliothek 22.1.1. Mein Ziel ist es, eine benutzerdefinierte Bewertungsleiste zu tönen, um zu vermeiden, dass mehrere Bilder in meine APK aufgenommen werden müssen.Benutzerdefinierte BewertungBar Färbung API <21 mit Support-Bibliothek 22.1.1

Die Abtönung wird korrekt auf API 22 angewendet, aber nicht auf API 19. Ich möchte, dass es auf API> = 16 funktioniert. Beachten Sie, dass ich versuche, nur den "Fortschritt" zu tönen, nicht den vollen Balken . Hier

ist der Bewertungsleiste Stil:

<style name="customRatingBar" parent="Widget.AppCompat.RatingBar"> 
    <item name="android:progressDrawable">@drawable/custom_ratingbar</item> 
    <item name="android:minHeight">24dp</item> 
    <item name="android:maxHeight">24dp</item> 
    <item name="android:progressTint">@color/md_red_700</item> 
    <item name="android:secondaryProgressTint">@color/md_red_700</item> 
</style> 

Und die custom_ratingbar.xml Datei:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@android:id/background" 
     android:drawable="@drawable/ic_heart_outline_grey600_24dp" /> 
    <item android:id="@android:id/progress" 
     android:drawable="@drawable/ic_heart_grey600_24dp" /> 
</layer-list> 

es auf diese Weise in meinem Layout angewendet wird, die in einem Fragment erstreckt android.support.v4.Fragment sich innerhalb einer Aktivität erstreckt android.support.v7.app.AppCompatActivity :

<RatingBar 
    android:layout_width="wrap_content" 
    android:layout_height="22dp" 
    android:id="@+id/checkin_rating" 
    style="@style/customRatingBar" 
    android:isIndicator="true" 
    android:numStars="5" 
    android:stepSize="1" 
    android:layout_marginBottom="8dp"/> 

Ich erhalte eine Warnung von den Lint-Tools, dass android:progressTint nicht von API unterstützt wird. < 21. Gibt es eine Möglichkeit, dies zu erreichen, ohne mehrere Zeichen zu verwenden?

Antwort

9

Mit Unterstützung Bibliothek> 22 konnte ich diese getProgressDrawable

LayerDrawable stars = (LayerDrawable) bar.getProgressDrawable(); 
stars.getDrawable(0).setColorFilter(FULL_COLOR, PorterDuff.Mode.SRC_ATOP); 
stars.getDrawable(1).setColorFilter(PARTIAL_COLOR, PorterDuff.Mode.SRC_ATOP); 
stars.getDrawable(2).setColorFilter(NONE_COLOR, PorterDuff.Mode.SRC_ATOP); 

arbeiten diese nicht vor dem Support-Bibliothek tun, 22, so denke ich, das Ihr Problem lösen wird.

+1

auf 4.1.1 die ziehbar von getProgressDrawable zurück nicht zu LayerDrawable gegossen und gibt eine Ausnahme bei –

+0

Dank Gary, Dies hat mir geholfen, meine unten beschriebene Lösung zu finden. –

0

Ich wollte Garys Antwort nicht unbedingt bearbeiten, die akzeptiert wurde (wenn ich es überhaupt kann), aber ich fand die Reihenfolge von FULL/PARTIAL/NONE war nicht korrekt für mich. So habe ich es implementiert und es funktioniert für API 18+.

Um die Starbar (meine Unterklasse von AppCompatRatingBar) gelb mit grau für ungefüllte Sterne gesetzt:

int yellow = ContextCompat.getColor(getContext(), R.color.starbar_star_yellow); 
    int gray = ContextCompat.getColor(getContext(), R.color.starbar_star_gray); 

    Drawable starbarDrawable = this.getProgressDrawable(); 
    DrawableCompat.setTint(starbarDrawable, yellow); // this works for API 21+ 

    // this ensures it works for API 18-20 
    if(starbarDrawable instanceof LayerDrawable) { 
     LayerDrawable stars = (LayerDrawable) starbarDrawable; 
     stars.getDrawable(0).setColorFilter(gray, PorterDuff.Mode.SRC_ATOP); // UNFILLED 
     stars.getDrawable(1).setColorFilter(yellow, PorterDuff.Mode.SRC_ATOP); // PARTIAL OR FULL? 
     stars.getDrawable(2).setColorFilter(yellow, PorterDuff.Mode.SRC_ATOP); // PARTIAL OR FULL? 
    }