在一个对象上设置背景颜色,更改另一个对象

时间:2013-03-20 17:13:55

标签: java android android-resources android-drawable

我有一个带有drawable作为背景的TextView。使用StateListDrawable对象我试图以编程方式设置背景颜色,但我遇到了意外的行为:我在一个对象中设置颜色,在另一个对象中更改颜色。这应该是不可能的。

相关代码:

    GradientDrawable notPressed = (GradientDrawable) getResources().getDrawable(R.drawable.rectangle);
    GradientDrawable isPressed = (GradientDrawable) getResources().getDrawable(R.drawable.rectangle);
    isPressed.setColor(util.getColour(api, this));

    StateListDrawable bg = new StateListDrawable();
    // bg.addState(new int[] { android.R.attr.state_pressed }, isPressed);
    bg.addState(StateSet.WILD_CARD, notPressed);

    textView.setBackgroundDrawable(bg);

drawable:

<shape  xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
<stroke android:width="1dp" android:color="@color/divider" />
<solid android:color="@color/background_button" />
</shape>

util.getColour根据api的值返回颜色资源。

奇怪的是,在上面的代码中设置了isPressed drawable的颜色,但之后没有使用这个drawable。相反,只有notPressed drawable被添加到textView的背景中。

但是textView的背景颜色变成了isPressed drawable的颜色!这应该是不可能的,因为它们应该是两个不同的对象,即使它们是从相同的可绘制资源创建的。

2 个答案:

答案 0 :(得分:1)

我认为当你获得资源时,你会得到相同的参考资料。因此notPressedisPressed是同一个对象。我相信某处有克隆操作......

编辑:

是的,你必须在修改之前调用drawable上的mutate()。请参阅Adding a color filter to a Drawable changes all Buttons using the same Drawable

答案 1 :(得分:0)

Android为可绘制资源使用相同的对象,除非您指定需要新副本。

您可以使用此代码来解决此问题:

Drawable isPressed  = notPressed.getConstantState().newDrawable();