在ListView中更改可绘制实例的背景

时间:2014-07-09 08:16:56

标签: android xml listview drawable

我有一个可绘制的资源drawable/badge.xml,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
    <solid android:color="#000" />
</shape>

...并在布局文件layout/badge.xml中使用,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="18dp"
    android:layout_height="18dp" >

    <View
        android:id="@+id/badge"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/badge" />

    <TextView
        android:id="@+id/badge_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical|center_horizontal"
        android:textColor="#fff"
        android:textSize="12sp"
        android:textStyle="bold" />

</RelativeLayout>

在BaseExpandableListAdapters getChildView方法中,有以下代码:

...
LinearLayout badgeContainer = (LinearLayout) convertView.findViewById(R.id.badge_container);
for (String property : properties) {

    RelativeLayout badge = (RelativeLayout) inflater.inflate(R.layout.badge, badgeContainer, false);

    badge.setLayoutParams(new LinearLayout.LayoutParams(50, 50));

    ((TextView) badge.findViewById(R.id.badge_text)).setText(course.property);
    badge.findViewById(R.id.badge).getBackground().setColorFilter(getColorResourceByProperty(property), PorterDuff.Mode.DST);

    badgeContainer.addView(badge);
}
...

因此,我尝试做的是更改每个property的可绘制徽章的背景颜色,但此代码仍会在所有徽章中产生黑色背景。我究竟做错了什么?我还尝试了许多其他没有结果的PorterDuff模式。

1 个答案:

答案 0 :(得分:0)

经过多次战斗,我得到了这样的工作:

drawable/circle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <solid android:color="#fff" />

</shape>

layout/badge.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/badge_text"
    android:layout_width="16dp"
    android:layout_height="16dp"
    android:gravity="center_vertical|center_horizontal"
    android:background="@drawable/circle"
    android:textColor="@color/white"
    android:textSize="12sp"
    android:layout_marginLeft="1dp"
    android:textStyle="bold" />

并在适配器内部:

LinearLayout badgeContainer = (LinearLayout) convertView.findViewById(R.id.badge_container);
for (int i = 0; i < course.properties.length; i++) {

    TextView badge = (TextView) inflater.inflate(R.layout.badge, badgeContainer, false);
    badge.setText(course.properties[i]);
    int colorID = context.getResources().getIdentifier("property_" + course.properties[i], "color", context.getPackageName());
    badge.getBackground().setColorFilter(context.getResources().getColor(colorID), Mode.MULTIPLY);

    badgeContainer.addView(badge);
}