Home » Android » Android ProgressBar: how to set secondary color programmatically

Android ProgressBar: how to set secondary color programmatically

Posted by: admin June 15, 2020 Leave a comment

Questions:

I need to set secondary progress bar color programmatically.

I only see the method

ProgressBar.setProgressDrawable(drawable)

for set the primary color, but there isn’t a method for set the secondary color.

How I can do it?

How to&Answers:

ProgressBar.getProgressDrawable() returns a LayerDrawable in which:

LayerDrawable progressDrawable = (LayerDrawable) getProgressDrawable();
Drawable backgroundColor = progressDrawable.getDrawable(0);
Drawable secondaryColor = progressDrawable.getDrawable(1);
Drawable primaryColor = progressDrawable.getDrawable(2);

I try to modify the colors whit (example):

progressDrawable.setDrawableByLayerId(progressDrawable.getId(2), new ClipDrawable(...));

but sometimes the screen freeze, sometimes crash.
Finally I abandoned the search for lack of time.
Sorry 🙁

Michele

Answer:

Probably not relevant to Michele, but perhaps it will help someone else..

ProgressBar progress = (ProgressBar) fullView.findViewById(R.id.main_progressbar);
LayerDrawable progressDrawable = (LayerDrawable)progress.getProgressDrawable();
Drawable drawable = activity.getResources().getDrawable(R.drawable.WHATEVER_YOU_WANT);
ClipDrawable cd = new ClipDrawable(drawable, Gravity.LEFT,ClipDrawable.HORIZONTAL);
progressDrawable.setDrawableByLayerId(android.R.id.progress, cd);

Answer:

The drawable you specify using setProgressDrawable has background, primary and secondary drawables in it. Here is an example of ProgressBar drawable that is shipped with android:

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

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient ...  />
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient .../>
            </shape>
        </clip>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient ...  />
            </shape>
        </clip>
    </item>

</layer-list> 

Answer:

Check this

You can use a drawable xml like this to set progressdrawable

<item android:id="@android:id/background"
    android:drawable="@drawable/progress_bar_nor">       
</item>    
<item android:id="@android:id/secondaryProgress"
    android:drawable="@drawable/progress_bar_nor">       
</item>
<item
    android:id="@android:id/progress"
    android:drawable="@drawable/progress_bar_sel"/>

Refer this link

https://stackoverflow.com/a/27144594/1554031