Domanda

Sto usando un orizzontale barra di avanzamento nella mia applicazione Android, e voglio cambiare il suo progresso colore (che è di default Giallo).Come posso fare utilizzando code (non XML)?

È stato utile?

Soluzione

Mi dispiace che non è la risposta, ma ciò che sta guidando l'impostazione dal codice requisito? E .setProgressDrawable dovrebbe funzionare se è definito correttamente

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@android:id/background">
    <shape>
        <corners android:radius="5dip" />
        <gradient
                android:startColor="#ff9d9e9d"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:angle="270"
        />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#80ffd300"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:angle="270"
            />
        </shape>
    </clip>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="@color/progress_start"
                android:endColor="@color/progress_end"
                android:angle="270" 
            />
        </shape>
    </clip>
</item>

</layer-list>

Altri suggerimenti

Per un ProgressBar orizzontale, è possibile utilizzare un ColorFilter, anche, in questo modo:

progressBar.getProgressDrawable().setColorFilter(
    Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

 Rosso ProgressBar mediante filtro a colori

Nota: Questa modifica l'aspetto di tutte le barre di avanzamento nella vostra app. Per modificare solo una specifica barra di avanzamento, fare questo:

Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);

Se Progressbar è indeterminato quindi utilizzare getIndeterminateDrawable() invece di getProgressDrawable().

Da Lollipop (API 21) è possibile impostare una tinta corso:

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

 Rosso ProgressBar usando il progresso tinta

Questa non è a livello di codice, ma penso che potrebbe aiutare un sacco di gente in ogni caso.
Ho provato un sacco e il modo più efficace è stato quello di aggiungere queste righe al mio ProgressBar nel file XML:

            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary"

Così, alla fine di questo codice ha fatto per me:

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginTop="50dp"
            android:layout_marginBottom="50dp"
            android:visibility="visible"
            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary">

Questa soluzione funziona per API 21 +

Per il mio progressbar indeterminata (filatore) Ho appena creato un filtro di colore sul drawable. Funziona alla grande e una sola riga.

Esempio dove il colore rosso impostazione:

ProgressBar spinner = new android.widget.ProgressBar(
                context,
                null,
                android.R.attr.progressBarStyle);

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, android.graphics.PorterDuff.Mode.MULTIPLY);

entrare descrizione dell'immagine qui

Questa è una vecchia questione, ma utilizzando tema non è menzionato qui. Se il tema di default sta usando AppCompat, il colore del vostro ProgressBar verrà colorAccent avete definito.

La modifica colorAccent cambierà anche il colore del vostro ProgressBar, ma cambia anche riflette in più luoghi. Quindi, se si desidera un colore diverso solo per un PregressBar specifica è possibile farlo applicando tema che ProgressBar:

  • Estendere il tema di default e sovrascrivere colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
    
  • E nel ProgressBar aggiungere l'attributo android:theme:

    android:theme="@style/AppTheme.WhiteAccent"
    

Così sarà simile a questa:

<ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:theme="@style/AppTheme.WhiteAccent" />

Quindi, si sta solo cambiando un colorAccent per il vostro particolare ProgressBar.

Nota: Usando style non funzionerà. È necessario utilizzare solo android:theme. Potete trovare più uso di tema qui: https://plus.google.com/u/0/ + AndroidDevelopers / messaggi / JXHKyhsWHAH

Tutti API

se l'uso tutte le API basta creare il tema in stile

style.xml

<resources>

    //...

    <style name="progressBarBlue" parent="@style/Theme.AppCompat">
        <item name="colorAccent">@color/blue</item>
    </style>

</resources>

e utilizzare in corso

<ProgressBar
    ...
    android:theme="@style/progressBarBlue" />

livello API 21 e superiore

se utilizzato in livello API 21 e superiori basta usare questo codice:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>

come per alcuni dei suggerimenti, è possibile specificare una forma e clipdrawable con un colore, quindi impostarlo. Ho questo lavoro programatically. Questo è come lo faccio ..

Prima di tutto assicuratevi di importare la libreria drawable ..

import android.graphics.drawable.*;

Quindi utilizzare il codice simile al di sotto;

ProgressBar pg = (ProgressBar)row.findViewById(R.id.progress);
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null,null));
String MyColor = "#FF00FF";
pgDrawable.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
pg.setProgressDrawable(progress);   
pg.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
pg.setProgress(45);

Questo ha funzionato per me:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />

se Indeterminato:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

Al giorno d'oggi nel 2016 ho trovato alcuni dispositivi pre-lecca non rispettano l'impostazione colorAccent, quindi la mia soluzione finale per tutte le API è ora la seguente:

// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

    Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
    DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
    mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
    mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}

Per i punti bonus, non fa uso di alcun codice deprecato. Provalo!

Questo è quello che ho fatto. Ha lavorato.

ProgressBar:

<ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:indeterminateDrawable="@drawable/progressdrawable"
           />

progressdrawable.xml:
Qui usano gradiente di cambiare colore mentre gradite. E Android: toDegrees = "X" increse il valore di X e progressbar ruotano velocemente. Diminuire e ruotare slow.Customize base alle proprie esigenze.

<?xml version="1.0" encoding="utf-8"?>
     <rotate xmlns:android="http://schemas.android.com/apk/res/android"
            android:duration="4000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" >

            <shape
                android:innerRadius="20dp"
                android:shape="ring"
                android:thickness="4dp"
                android:useLevel="false" >
                <size
                    android:height="48dp"
                    android:width="48dp" />

                <gradient
                    android:centerColor="#80ec7e2a"
                    android:centerY="0.5"
                    android:endColor="#ffec7e2a"
                    android:startColor="#00ec7e2a"
                    android:type="sweep"
                    android:useLevel="false" />
            </shape>

        </rotate>

campione: entrare image description qui

Hit lo stesso problema mentre si lavora sulla modifica il look / feel della barra di avanzamento di default. Ecco qualche informazione in più che, si spera aiutare le persone:)

  • Il nome del file XML deve contenere solo caratteri: a-z0-9_.
  • (vale a dire senza capitali.!)
  • Per fare riferimento il vostro "disegnabile" è R.drawable.filename
  • Per ignorare l'aspetto di default, è possibile utilizzare myProgressBar.setProgressDrawable(...), tuttavia è necessario non si può semplicemente consultare il layout personalizzato come R.drawable.filename, è necessario recuperare come un Drawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
    
  • È necessario impostare lo stile prima di impostare il progresso / avanzamento secondaria / max (impostando poi per me ha comportato un barra di avanzamento 'vuoto')

Probabilmente c'è una cosa che non è stata di cui al presente risposta:

Se il tema eredita dal Theme.AppCompat, ProgressBar assumerà il colore definito come "colorAccent" nel tema.

Quindi, utilizzando ..

  

<item name="colorAccent">@color/custom_color</item>

.. consente di colorare l'colore della ProgressBar automagicamente al @color/custom_color.

Come ho fatto in ProgressBar orizzontale:

    LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
    Drawable progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress);
    progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);

Si può cercare di cambiare gli stili, temi, oppure utilizzando Android: indeterminateTint = "@ colore / yourColor" ovunque si desidera, ma c'è solo un modo o fare che funzionerà su qualsiasi versione SKD Android:

Se si procede a barre non è indeterminato, si prega di utilizzare:

progressBar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.yourColor), PorterDuff.Mode.SRC_IN );

Se si procede bar è indeterminata, si prega di utilizzare:

progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.yourColor), PorterDuff.Mode.SRC_IN );

E 'triste che Android è un tale casino!

android:progressTint="#ffffff" 

più semplice soluzione se si desidera cambiare il colore nel file di layout XML, utilizzare il codice qui sotto e utilizzare indeterminateTint proprietà per il vostro colore desiderato.

    <ProgressBar
      android:id="@+id/progressBar"
      style="?android:attr/progressBarStyle"
      android:layout_width="wrap_content"
      android:indeterminate="true"
      android:indeterminateTintMode="src_atop"
      android:indeterminateTint="#ddbd4e"
      android:layout_height="wrap_content"
      android:layout_marginBottom="20dp"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true" />

Questa soluzione ha funzionato per me:

<style name="Progressbar.White" parent="AppTheme">
    <item name="colorControlActivated">@color/white</item>
</style>

<ProgressBar
    android:layout_width="@dimen/d_40"
    android:layout_height="@dimen/d_40"
    android:indeterminate="true"
    android:theme="@style/Progressbar.White"/>

Ancora una piccola cosa, la soluzione tema non funziona se si eredita un tema di base, quindi per app compattare il tema dovrebbe essere:

<style name="AppTheme.Custom" parent="@style/Theme.AppCompat">
    <item name="colorAccent">@color/custom</item>
</style>

E poi impostare questo tema nella barra di avanzamento

<ProgressBar
    android:id="@+id/progressCircle_progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:theme="@style/AppTheme.Custom"
    android:indeterminate="true"/>

Inviato aggiungere informazioni sulla di PaulieG risposta , dal momento che ateiob mi ha chiesto di spiegare qualcosa ...


posso dire che non v'è (o almeno era, al momento della scrittura quando ho guardato che la versione corrente del codice sorgente di Android) un bug / problema / ottimizzazione nel codice ProgressBar che ignora un tentativo di impostare lo stato di avanzamento ad un valore che è già.

  • vale a dire. se il progresso = 45, e si tenta di impostare a 45, il codice non fa nulla, e non ridisegnare lo stato di avanzamento .

Dopo aver chiamato ProgressBar.setProgressDrawable(), la vostra barra di avanzamento sarà vuoto (perché è stata modificata la parte drawable).

Questo significa che è necessario impostare il progresso, e ridisegnare esso. Ma se è sufficiente impostare l'avanzamento ad un valore conservato, esso non farà nulla.

È necessario impostare a 0, poi per il valore "vecchio" di nuovo, e il bar sarà ridisegnare.


Quindi, per riassumere:

  • preservare il "vecchio" valore progresso
  • aggiornare il drawable / colore (fa bar vuoto)
  • azzerare i progressi a 0 (riga successiva altrimenti non fa nulla)
  • ripristinare i progressi per il "vecchio" valore (correzioni bar)
  • invalidate

Di seguito è riportato un metodo che ho che fa questo:

protected void onResume()
{
    super.onResume();
    progBar = (ProgressBar) findViewById(R.id.progress_base);

    int oldProgress = progBar.getProgress();

    // define new drawable/colour
    final float[] roundedCorners = new float[]
        { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable shape = new ShapeDrawable(new RoundRectShape(
        roundedCorners, null, null));
    String MyColor = "#FF00FF";
    shape.getPaint().setColor(Color.parseColor(MyColor));
    ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,
        ClipDrawable.HORIZONTAL);
    progBar.setProgressDrawable(clip);

    progBar.setBackgroundDrawable(getResources().getDrawable(
        android.R.drawable.progress_horizontal));

    // work around: setProgress() ignores a change to the same value
    progBar.setProgress(0);
    progBar.setProgress(oldProgress);

    progBar.invalidate();
}

Per quanto riguarda la soluzione di HappyEngineer, penso che sia stata una soluzione simile, per impostare manualmente il "progresso" offset. In entrambi i casi, il codice di cui sopra dovrebbe funzionare per voi.

Utilizza il android.support.v4.graphics. drawable.DrawableCompat :

            Drawable progressDrawable = progressBar.getIndeterminateDrawable();
            if (progressDrawable  != null) {
                Drawable mutateDrawable = progressDrawable.mutate();
                DrawableCompat.setTint(mutateDrawable, primaryColor);
                progressBar.setProgressDrawable(mutateDrawable);
            }

Per un ProgressBar stile orizzontale che uso:

import android.widget.ProgressBar;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.ClipDrawable;
import android.view.Gravity;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;

public void setColours(ProgressBar progressBar,
                        int bgCol1, int bgCol2, 
                        int fg1Col1, int fg1Col2, int value1,
                        int fg2Col1, int fg2Col2, int value2)
  {
    //If solid colours are required for an element, then set
    //that elements Col1 param s the same as its Col2 param
    //(eg fg1Col1 == fg1Col2).

    //fgGradDirection and/or bgGradDirection could be parameters
    //if you require other gradient directions eg LEFT_RIGHT.

    GradientDrawable.Orientation fgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;
    GradientDrawable.Orientation bgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;

    //Background
    GradientDrawable bgGradDrawable = new GradientDrawable(
            bgGradDirection, new int[]{bgCol1, bgCol2});
    bgGradDrawable.setShape(GradientDrawable.RECTANGLE);
    bgGradDrawable.setCornerRadius(5);
    ClipDrawable bgclip = new ClipDrawable(
            bgGradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);     
    bgclip.setLevel(10000);

    //SecondaryProgress
    GradientDrawable fg2GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg2Col1, fg2Col2});
    fg2GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg2GradDrawable.setCornerRadius(5);
    ClipDrawable fg2clip = new ClipDrawable(
            fg2GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Progress
    GradientDrawable fg1GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg1Col1, fg1Col2});
    fg1GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg1GradDrawable.setCornerRadius(5);
    ClipDrawable fg1clip = new ClipDrawable(
            fg1GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Setup LayerDrawable and assign to progressBar
    Drawable[] progressDrawables = {bgclip, fg2clip, fg1clip};
    LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);     
    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    //Copy the existing ProgressDrawable bounds to the new one.
    Rect bounds = progressBar.getProgressDrawable().getBounds();
    progressBar.setProgressDrawable(progressLayerDrawable);     
    progressBar.getProgressDrawable().setBounds(bounds);

    // setProgress() ignores a change to the same value, so:
    if (value1 == 0)
        progressBar.setProgress(1);
    else
        progressBar.setProgress(0);
    progressBar.setProgress(value1);

    // setSecondaryProgress() ignores a change to the same value, so:
    if (value2 == 0)
        progressBar.setSecondaryProgress(1);
    else
        progressBar.setSecondaryProgress(0);
    progressBar.setSecondaryProgress(value2);

    //now force a redraw
    progressBar.invalidate();
  }

Una chiamata esempio potrebbe essere:

  setColours(myProgressBar, 
          0xff303030,   //bgCol1  grey 
          0xff909090,   //bgCol2  lighter grey 
          0xff0000FF,   //fg1Col1 blue 
          0xffFFFFFF,   //fg1Col2 white
          50,           //value1
          0xffFF0000,   //fg2Col1 red 
          0xffFFFFFF,   //fg2Col2 white
          75);          //value2

Se non è necessario il 'progresso secondaria' sufficiente impostare valore2 a valore1.

Applicare questo stile personalizzato alla barra di avanzamento.

<style name="customProgress" parent="@android:style/Widget.ProgressBar.Small">
        <item name="android:indeterminateDrawable">@drawable/progress</item>
        <item name="android:duration">40</item>
        <item name="android:animationCache">true</item>
        <item name="android:drawingCacheQuality">low</item>
        <item name="android:persistentDrawingCache">animation</item>
    </style>

@ drawable / progress.xml -

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_white"
    android:pivotX="50%"
    android:pivotY="50%" />

Utilizzare questo tipo di immagine per la barra di avanzamento. entrare descrizione dell'immagine qui

Per un migliore risultato è possibile utilizzare più immagini di progresso. E per favore non esitate utilizzando immagini, perché Android piattaforma stessa utilizzare le immagini per progressbar. Il codice viene estratto dal sdk:)

Ecco il codice per cambiare il colore della ProgressBar dal programmaticamente.

ProgressBar progressBar = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
progressBar.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, android.graphics.PorterDuff.Mode.SRC_IN);
ProgressBar bar;

private Handler progressBarHandler = new Handler();

GradientDrawable progressGradientDrawable = new GradientDrawable(
        GradientDrawable.Orientation.LEFT_RIGHT, new int[]{
                0xff1e90ff,0xff006ab6,0xff367ba8});
ClipDrawable progressClipDrawable = new ClipDrawable(
        progressGradientDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
Drawable[] progressDrawables = {
        new ColorDrawable(0xffffffff),
        progressClipDrawable, progressClipDrawable};
LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);


int status = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // TODO Auto-generated method stub
    setContentView(R.layout.startup);

    bar = (ProgressBar) findViewById(R.id.start_page_progressBar);
    bar.setProgress(0);
    bar.setMax(100);

    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    bar.setProgressDrawable(progressLayerDrawable);
}

Questo mi ha aiutato a impostare un colore personalizzato per progressbar tramite il codice.Speranza che aiuta

Come per Muhammad-Adil suggerito per SDK ver 21 e sopra

android:indeterminateTint="@color/orange"

in Works XML per me, è abbastanza facile.

E 'così semplice utilizzando attr, se avete a che fare con le applicazioni Multistyle:

provare in questo modo:

Dichiarare sotto attributo attrs.xml

 <attr name="circularProgressTheme" format="reference"></attr>

Incolla sotto il codice a styles.xml

 <style name="ProgressThemeWhite" parent="ThemeOverlay.AppCompat.Light">
        <item name="colorAccent">#FF0000</item>
    </style>

    <style name="circularProgressThemeWhite">
        <item name="android:theme">@style/ProgressThemeWhite</item>
    </style>


  <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

   <item name="circularProgressTheme">@style/circularProgressThemeWhite</item>

 </style>

utilizzare barra di avanzamento come qui di seguito

  <ProgressBar
        style="?attr/circularProgressTheme"
        android:id="@+id/commonProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="visible"/>

avanzamento orizzontale stile materiale bar personalizzato:

Per modificare il colore di sfondo e il progresso della barra di avanzamento orizzontale.

<style name="MyProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
    <item name="android:progressBackgroundTint">#69f0ae</item>
    <item name="android:progressTint">#b71c1c</item>
    <item name="android:minWidth">200dp</item>
</style>

Applica alla barra di avanzamento impostando attributo di stile, per gli stili materiali personalizzati e di controllo barra di avanzamento personalizzato http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples

Per cambiare il colore ProgressBar orizzontale (in Kotlin):

fun tintHorizontalProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.progressTintList = ColorStateList.valueOf(color)
    } else{
        val layerDrawable = progress.progressDrawable as? LayerDrawable
        val progressDrawable = layerDrawable?.findDrawableByLayerId(android.R.id.progress)
        progressDrawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    }
}

Per cambiare colore indeterminato ProgressBar:

fun tintIndeterminateProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.indeterminateTintList = ColorStateList.valueOf(color)
    } else {
        (progress.indeterminateDrawable as? LayerDrawable)?.apply {
            if (numberOfLayers >= 2) {
                setId(0, android.R.id.progress)
                setId(1, android.R.id.secondaryProgress)
                val progressDrawable = findDrawableByLayerId(android.R.id.progress).mutate()
                progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
            }
        }
    }
}

Ed infine normalmente tinta ProgressBars pre-lollipop

progresso colorato su api 19

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top