Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一个对象上设置背景色会更改另一个对象_Java_Android_Android Resources_Android Drawable - Fatal编程技术网

Java 在一个对象上设置背景色会更改另一个对象

Java 在一个对象上设置背景色会更改另一个对象,java,android,android-resources,android-drawable,Java,Android,Android Resources,Android Drawable,我有一个文本视图,背景是可绘制的。使用StateListDrawable对象,我试图以编程方式设置背景颜色,但我遇到了意想不到的行为:我在一个对象中设置了颜色,而在另一个对象中更改了颜色。这应该是不可能的 有关守则: GradientDrawable notPressed = (GradientDrawable) getResources().getDrawable(R.drawable.rectangle); GradientDrawable isPressed = (Grad

我有一个文本视图,背景是可绘制的。使用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);
可抽出式:

<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.getColor
返回基于api值的颜色资源

奇怪的是,在上面的代码中,
isPressed
drawable的颜色已经设置好了,但之后就不再使用这个drawable了。相反,只有
notPressed
drawable被添加到文本视图的背景中


但是文本视图的背景色变为
显示的
可绘制的颜色!这应该是不可能的,因为它们应该是两个不同的对象,即使它们是从同一个可绘制资源创建的。

我认为当您获得一个资源时,您会获得对它的相同引用。因此,
notPressed
isPressed
是同一个对象。我相信某处有克隆人的行动

编辑:


是的,在修改绘图表之前,必须在绘图表上调用
mutate()
。请参阅。

Android将同一对象用于可绘制资源,除非您指定需要该对象的新副本

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

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

检查是否未按下
=isPressed
我怀疑两者是同一个对象。