【问题标题】:XML progressDrawable file leaks, for few objects at timeXML progressDrawable 文件泄漏,一次很少有对象
【发布时间】:2025-12-16 10:00:01
【问题描述】:

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

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

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

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

在这里,circle1,circle2,circle3 - 类似的 XML Drawable 文件。我觉得我的方案太不灵活了。

我的圈子:

<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"/>

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

【问题讨论】:

    标签: java xml android-layout drawable layer-list


    【解决方案1】:

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

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

    可以这样使用:

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

    【讨论】: