2013-03-20 3 views
0

У меня есть 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 возвращает цвет ресурс, основанный на значении апи.

Странно, что в приведенном выше коде установлен цвет isPressed drawable, но после этого этот drawable не используется. Вместо этого на задний план textView добавляется только notPressed drawable.

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

+0

флажка, если 'notPressed = isPressed' Я подозреваю, что оба те же объект. –

ответ

1

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

Edit:

Да, вы должны вызвать mutate() на Drawable перед внесением изменений. См. Adding a color filter to a Drawable changes all Buttons using the same Drawable.

+0

Это трюк ... спасибо! – Wouter

0

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

вы можете использовать этот код, чтобы решить эту проблему!

Drawable isPressed = notPressed.getConstantState().newDrawable(); 
Смежные вопросы