javaxmlandroid-layoutdrawablelayer-list

XML progressDrawable file leaks, for few objects at time


I have XML progressDrawable file for my ListView. It works well, but I found that if I use one Drawable XML file to make background for few object in one time, it works wrong.

Now I'm just created few XML Drawable files for each item from my ListView.

Now, my solution is like that:

for (int i = 0; i < 3; i++) {
                    View v1 = getActivity().getLayoutInflater().inflate(R.layout.item_results, null);
                    ProgressBar bar = v1.findViewById(R.id.MyDonut);
                    bar.setProgressDrawable(getResources().getDrawable(i==0?R.drawable.circle1:i==1?R.drawable.circle2:R.drawable.circle3));
                    listView.addHeaderView(v1);
}                 

Here, the circle1,circle2,circle3 - similar XML Drawable files. I think that my solution is too unflexible.

My circle:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape
        android:shape="ring"
        android:thicknessRatio="10"
        android:useLevel="false">
        <solid android:color="@color/orange" />
    </shape>
</item>
<item>
    <rotate
        android:fromDegrees="270"
        android:toDegrees="270"
        android:pivotX="50%"
        android:pivotY="50%">
        <shape
            android:shape="ring"
            android:thicknessRatio="10"
            android:useLevel="true">
            <solid android:color="@color/green" />
        </shape>
    </rotate>
</item>
<item android:left="75dp" android:gravity="center">
    <rotate android:pivotX="0%" android:fromDegrees="270" android:toDegrees="270">
        <shape
            android:shape="line"
            android:useLevel="false">

            <size android:width="75dp" android:height="75dp"/>
            <stroke android:width="3dp" android:color="@color/light"/>
        </shape>
    </rotate>
</item>
<item android:left="75dp" android:gravity="center">
    <rotate android:pivotX="0%" android:fromDegrees="270" android:toDegrees="630">
        <shape
            android:shape="line"
            android:useLevel="false">

            <size android:width="75dp" android:height="75dp"/>
            <stroke android:width="3dp" android:color="@color/light"/>
        </shape>
    </rotate>
</item>

item-results just contains:

<ProgressBar
        android:progress="0"
        android:id="@+id/MyDonut"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:background="@color/light"
        style="?android:progressBarStyleHorizontal"/>

What about the other solutions of this issue?


Solution

  • Finaly, I found a good solution. We can use drawable.mutate() to set the other Drawable, with all properties from parent Drawable.

    Documentation: https://developer.android.com/reference/android/graphics/drawable/Drawable#mutate()

    It is possible to use this this way:

    progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.circle).mutate());