XML progressDrawable 文件泄漏,一次只有几个对象

XML progressDrawable file leaks, for few objects at time

我的 ListView 有 XML 个 progressDrawable 文件。效果很好,但我发现如果我使用一个 Drawable XML 文件一次为几个对象制作背景,它会出错。

现在我刚刚为我的 ListView 中的每个项目创建了几个 XML 可绘制文件。

现在,我的解决方案是这样的:

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

此处,circle1circle2circle3 - 类似 XML 可绘制文件。我觉得我的方案太不灵活了。

我的圈子:

<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 仅包含:

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

这个问题的其他解决方案呢?

终于找到了一个很好的解决办法。我们可以使用 drawable.mutate() 来设置另一个 Drawable,所有属性都来自父 Drawable。

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

可以这样使用:

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