У меня есть представление, на котором я установил 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
?
Ханнес, см. Мой ответ здесь: http://stackoverflow.com/questions/13927896/android-button-with-text-and-image/17542264#17542264 – pskink