Android - Tinting ProgressBar on pre-Lollipop devices Android - Tinting ProgressBar on pre-Lollipop devices android android

Android - Tinting ProgressBar on pre-Lollipop devices


You can wrap with ProgressBar indeterminateDrawable method for pre-Lollipop.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {     Drawable drawableProgress = DrawableCompat.wrap(progressBar.getIndeterminateDrawable());     DrawableCompat.setTint(drawableProgress, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));     progressBar.setIndeterminateDrawable(DrawableCompat.unwrap(drawableProgress));} else {    progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);}


progress.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);


Thanks for the suggestions from everyone! :)

The solution which works for me is to create a custom drawable XML file with the <layer-list> root element. There, I'm defining two layer items with the native Android IDs @android:id/background and @android:id/progress. After this, I can define the shapes and color resources I would like to use. This solution is similar to a more popular answer on this SO question.


Content of my res/drawable/progressbar.xml file:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <item android:id="@android:id/background">        <shape>            <corners android:radius="2dip" /> <!--optional-->            <gradient                android:angle="270"                android:endColor="@color/gray"                android:startColor="@color/gray" />        </shape>    </item>    <item android:id="@android:id/progress">        <clip>            <shape>                <corners android:radius="2dip" /> <!--optional-->                <gradient                    android:angle="270"                    android:endColor="@color/blue"                    android:startColor="@color/blue" />            </shape>        </clip>    </item></layer-list>

Defined as progressDrawable for my ProgressBar in the layout XML file:

<ProgressBar        android:id="@+id/progress_bar"        android:layout_width="0dp"        android:layout_height="@dimen/progress_bar_height"        android:progressDrawable="@drawable/progressbar" />

I didn't have a chance to test it below API 19, but on this level and above it works perfectly.