Pregunta

Estoy usando una barra de progreso horizontal en mi aplicación Android, y quiero cambiar su color de progreso (que es amarillo por defecto). ¿Cómo puedo hacer que el uso de code (no XML)?

¿Fue útil?

Solución

Lo siento que no es la respuesta, pero lo que está impulsando el ajuste desde el código requisito? Y .setProgressDrawable debería funcionar si está definida correctamente

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

Otros consejos

Para una ProgressBar horizontal, se puede utilizar un ColorFilter, también, como esto:

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

 Red ProgressBar utilizando filtro de color

Nota: Esto modifica la apariencia de todas las barras de progreso en su aplicación. sólo para modificar una barra de progreso específico, haga lo siguiente:

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

Si progressBar es indeterminado luego usar getIndeterminateDrawable() en lugar de getProgressDrawable().

Desde Lollipop (API 21) se puede establecer un tinte de progreso:

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

 Red ProgressBar usando tinte progreso

Esto no es mediante programación, pero creo que podría ayudar a mucha gente de todos modos.
He intentado mucho y la forma más eficaz fue la de añadir estas líneas a mi ProgressBar en el archivo .xml:

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

Así que al final este código lo hizo por mí:

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

Esta solución funciona para API 21 +

Para mi progressbar indeterminada (spinner) que acaba de establecer un filtro de color en la estirable. Funciona muy bien y sólo una línea.

Ejemplo en el que la configuración de color a rojo:

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

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

introducir descripción de la imagen aquí

Esta es una vieja pregunta, pero utilizando el tema no se menciona aquí. Si el tema por defecto está utilizando AppCompat, el color de su ProgressBar será colorAccent que haya definido.

Cambiar colorAccent también cambiará el color de su ProgressBar, pero hay cambios también se refleja en múltiples lugares. Por lo tanto, si quieres un color diferente sólo por un PregressBar específica que puede hacer que al aplicar el tema al que ProgressBar:

  • Extender el tema por defecto y anular colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
    
  • Y en ProgressBar añadir el atributo android:theme:

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

Por lo tanto, se verá algo como esto:

<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" />

Por lo que se acaba de cambiar un colorAccent para su ProgressBar particular.

Nota: : El uso de style no va a funcionar. Es necesario utilizar android:theme solamente. Puede encontrar más uso del tema aquí: https://plus.google.com/u/0/ + AndroidDevelopers / mensajes / JXHKyhsWHAH

Todo API

si el uso de toda la API simplemente crear el tema en el estilo

style.xml

<resources>

    //...

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

</resources>

y uso en progreso

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

nivel API 21 y superior

si se utiliza en el nivel API 21 y superior sólo tiene que utilizar este código:

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

de acuerdo con algunas de las sugerencias, puede especificar una forma y clipdrawable con un color y luego la puso. Tengo este trabajo mediante programación. Así es como lo hago ..

En primer lugar asegurarse de importar la biblioteca dibujable ..

import android.graphics.drawable.*;

A continuación, utilice el código similar a continuación;

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

Esto funcionó para mí:

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

Si Indeterminado:

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

Hoy en día en el año 2016 me encontré con algunos dispositivos pre-lollipop no respetan la configuración colorAccent, así que mi solución final para todas las API que hoy es la siguiente:

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

Para obtener puntos de bonificación, que no utiliza ningún código obsoleto. Inténtelo!

Esto es lo que hice. Trabajado.

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:
aquí Utilice gradiente de cambiar de color a su gusto. Y android: toDegrees = "X" INCRESE el valor de X y progressbar giran rápidamente. Disminuir y girar slow.Customize de acuerdo a sus necesidades.

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

muestra: introducir descripción de la imagen aquí

Hit el mismo problema mientras se trabaja en la modificación de la mirada / sensación de la barra de progreso por defecto. Aquí hay más información que se espera ayude a la gente:)

  • El nombre del archivo XML sólo puede contener caracteres: a-z0-9_.
  • (es decir, sin mayúsculas.!)
  • Para hacer referencia a su "estirable" es R.drawable.filename
  • Para anular el aspecto por defecto, se utiliza myProgressBar.setProgressDrawable(...), sin embargo es necesario no sólo puede referirse a su diseño personalizado como R.drawable.filename, es necesario recuperarlo como Drawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
    
  • Es necesario configurar el estilo antes de progreso / avance secundaria / máx (ajuste que después me dio lugar a una barra de progreso 'vacío')

Probablemente hay una cosa que no ha hecho referencia en esta respuesta:

Si el tema es heredera de Theme.AppCompat, ProgressBar asumirá el color que ha definido como "colorAccent" en su tema.

Así que, usando ..

  

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

.. va a teñir el color de la ProgressBar automágicamente a la @color/custom_color.

¿Cómo lo hice en ProgressBar horizontal:

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

Se puede tratar de cambiar sus Estilos, temas, o el uso de Android: indeterminateTint = "@ Color / yourColor" cualquier lugar que desee, pero hay sólo una manera o hacer que funcione en cualquier versión de Android SKD:

Si Barra de progreso no es indeterminada, por favor utilice:

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

Si la barra del progreso es indeterminado, por favor utilice:

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

Es triste que Android es un desastre!

android:progressTint="#ffffff" 

solución más simple si usted quiere cambiar el color en el archivo de diseño xml, utilice el código abajo y utilizar indeterminateTint inmuebles a su color deseado.

    <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" />

Esta solución funcionó para mí:

<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"/>

Una cosa más pequeña, la solución tema funciona si se hereda un tema de base, por lo que para la aplicación compactar su tema debe ser:

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

Y a continuación, establecer esto en el tema de la barra de progreso

<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"/>

Publicado añadir información sobre de PaulieG respuesta , ya ateiob me pidió que explicar algo ...


Puedo decir que hay (o al menos era, en el momento de la escritura cuando vi que la versión actual del código fuente de Android) un bug / emisión / optimización en el código ProgressBar que ignora un intento de establecer el progreso a un valor que ya es en.

  • es decir. si el progreso = 45, y se intenta establecer a 45, el código no hará nada, y no se volverá a dibujar el progreso .

Después de llamar ProgressBar.setProgressDrawable(), la barra de progreso estará en blanco (porque ha cambiado la parte estirable).

Esto significa que necesita para establecer el progreso y volver a dibujar. Pero si usted acaba de establecer el progreso a un valor conservado, no hará nada.

Debe ponerlo a 0 primero, y luego con el valor "antiguo" de nuevo, y la barra se volverá a dibujar.


Para resumir:

  • preservar el valor progreso "viejo"
  • actualizar el dibujable / del color (blanco hace bar)
  • restablecer el progreso a 0 (línea siguiente de lo contrario no hace nada)
  • restablecer el progreso de la "vieja" de valor (correcciones bar)
  • invalidate

A continuación se muestra un método que tengo que hace esto:

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

En cuanto a la solución de HappyEngineer, creo que fue una solución similar para establecer manualmente el "progreso" offset. En cualquier caso, el código anterior debe trabajar para usted.

Utilice la . drawable.DrawableCompat :

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

Para una ProgressBar estilo horizontal que utilizo:

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 llamada ejemplo sería:

  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

Si usted no necesita el 'progreso secundaria' basta con establecer valor2 a valor1.

Aplicar este estilo personalizado a la barra de progreso.

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

@ estirable / 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%" />

Utilice este tipo de imagen para la barra de progreso. introducir descripción de la imagen aquí

Para obtener un mejor resultado que se puede utilizar varias imágenes de progreso. Y por favor, no dude uso de imágenes, porque la propia plataforma Android de utilizar imágenes para progressbar. El código se extrae de SDK:)

Este es el código para cambiar el color de ProgressBar mediante programación.

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

Esto me ayudó a establecer un color personalizado a través de progressbar código. Espero que ayude

Según Muhammad-Adil sugirió para SDK ver 21 y por encima

android:indeterminateTint="@color/orange"

Obras en XML para mí, es bastante fácil.

Es tan simple usando attr, si se trata de aplicaciones multistyle:

tratar de esta manera:

Declarar debajo attrs.xml atributo

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

Pegado a continuación código en 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>

utilizar barra de progreso, como a continuación

  <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"/>

Horizontal progreso material de la barra de estilo personalizado:

Para cambiar el color de fondo y el progreso de la barra de progreso horizontal.

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

Aplicar a progresar barra mediante el establecimiento de atributo de estilo, para los estilos de material personalizado y la barra de progreso personalizada de verificación http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples

Para cambiar el color ProgressBar horizontal (en 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)
    }
}

Para cambiar el color ProgressBar indeterminada:

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

Y por último normalmente tinte ProgressBars pre-lollipop

progreso teñido en api 19

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top