2013-07-17 2 views
0

У меня есть представление, на котором я установил StateListDrawable (определяет state_pressed и состояние по умолчанию) как background в XML. Это прекрасно работает, все состояния отображаются так, как ожидалось.Обтекание StateListDrawable

Теперь я хочу программно нарисовать что-то сверху StateListDrawable, независимо от того, в каком состоянии оно находится. Для этого я создал класс Java, который расширяет Drawable, который поддерживает исходный фон; в onDraw он сначала рисует оригинал, вытягиваемый на холст, а затем его собственные дополнения. Это также работает, но состояние оригинального чертежа не меняется.

Я могу видеть, что setState моего обычая Drawable вызывается с stateSet который содержит android.R.attr.state_pressed среди некоторых других государств. Я делегирую этот вызов исходному адресуемому, но там setState всегда возвращает false, и его состояние не изменяется. Это изменяется только тогда, когда я передаю stateSet, содержащий , только android.R.attr.state_pressed.

Кажется, что StateListDrawable как-то может объявить интересующие вас состояния и вызывающий абонент setState с уважением, хотя я не нашел ничего связанного в документах или в Android-источнике.

Это мой setState:

@Override public boolean setState(int[] stateSet) { 
    boolean changed = super.setState(stateSet); 
    if (originalBackground != null) { 
     // this call only returns true and changes the state if 
     // the stateSet *only* contains the pressed state 
     changed |= originalBackground.setState(stateSet); 
    } 
    return true; 
} 

Мой оригинальный фон Drawable:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
      android:drawable="@color/red"/> 
    <item android:drawable="@color/green"/> 
</selector> 

Как я могу сделать оригинальную вытяжку изменить свое состояние без фильтрации stateSet для state_pressed?

+2

Ханнес, см. Мой ответ здесь: http://stackoverflow.com/questions/13927896/android-button-with-text-and-image/17542264#17542264 – pskink

ответ

1

Благодаря примеру pskink я попытался позвонить invalidateSelf в onStateChanged, который сделал трюк.

+0

btw если вы расширили Drawable, вы переопределили isStateful() ? – pskink

+0

да, если бы я этого не сделал, я думаю, что setState вообще не будет вызван. –

Смежные вопросы