Проблема в том, что GradientDrawable в API 19, в котором я изначально пробовал этот пример, не поддерживает ColorStateList.Но потом я попробовал это на API 24 и все работало нормально, потому что API21 + поддерживает ColorStateList.
В API 19 , при накачивании устанавливается один цвет:
else if (name.equals("solid"))
{
a = r.obtainAttributes(attrs, com.android.internal.R.styleable.GradientDrawableSolid);
int argb = a.getColor(com.android.internal.R.styleable.GradientDrawableSolid_color, 0);
a.recycle();
setColor(argb);
}
В API 24 при накачке устанавливается ColorStateList:
else if (name.equals("solid"))
{
a = obtainAttributes(r, theme, attrs, R.styleable.GradientDrawableSolid);
updateGradientDrawableSolid(a);
a.recycle();
}
private void updateGradientDrawableSolid(TypedArray a)
{
final GradientState st = mGradientState;
// Account for any configuration changes.
st.mChangingConfigurations |= a.getChangingConfigurations();
// Extract the theme attributes, if any.
st.mAttrSolid = a.extractThemeAttrs();
final ColorStateList colorStateList = a.getColorStateList(
R.styleable.GradientDrawableSolid_color);
if (colorStateList != null) {
setColor(colorStateList);
}
}
Итак, состояние не изменяется, поскольку метод isStateful of GradientDrawable в API 19 не переопределяет себя и возвращаетfalse, поскольку это родительская реализация, и по API 24 вернет true, если метод isStateful из mSolidColors, то есть ColorStateList, вернет true.в противном случае - ложь.
@Override
public boolean isStateful() {
final GradientState s = mGradientState;
return super.isStateful()
|| (s.mSolidColors != null && s.mSolidColors.isStateful())
|| (s.mStrokeColors != null && s.mStrokeColors.isStateful())
|| (s.mTint != null && s.mTint.isStateful());
}
Как я понимаю, в API 19 невозможно установить способ выбора цвета для GradientDrawable, поскольку в API 21 добавлен setColor (ColorStateList).
Итак, какпрежде мне нужно создать 3 фигуры для изменения состояния.