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.