Установка цвета фона для одного объекта изменяет другой объект

У меня есть 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);

Рисуемый:

<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 не используется. Вместо этого к фону textView добавляется только notPressed drawable.

Но вместо этого цвет фона textView становится цветом isPressed! Это должно быть невозможно, так как это должны быть два разных объекта, даже если они созданы из одного и того же доступного для рисования ресурса.


person Wouter    schedule 20.03.2013    source источник
comment
проверьте, если notPressed!=isPressed я подозреваю, что это один и тот же объект.   -  person Marek R    schedule 20.03.2013


Ответы (2)


Я думаю, что когда вы получаете ресурс, вы получаете ту же ссылку на него. Итак, notPressed и isPressed — это один и тот же объект. Я полагаю, что где-то есть операция по клонированию...

Редактировать:

Да, вы должны вызвать mutate() для рисования, прежде чем изменять его. См. Добавление цвета filter на Drawable изменяет все кнопки, используя один и тот же Drawable.

person dmon    schedule 20.03.2013

Android использует один и тот же объект для ресурсов рисования, если вы не укажете, что вам нужна его новая копия.

вы можете использовать этот код для решения этой проблемы:

Drawable isPressed  = notPressed.getConstantState().newDrawable();
person Mr.Me    schedule 20.03.2013