我有这种形状
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="15dp"/>
<solid android:color="@color/butn_color"/>
<stroke android:width="3dp" android:color="#000"/>
</shape>
这个butn_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:color="#ffffcc"/>
<item android:state_selected="true"
android:color="#e6e600"/>
<item android:state_enabled="true"
android:color="#fff"/>
</selector>
为什么这不起作用?
据我所知,我的形状是GradientDrawable,这个类有方法
void setColor (ColorStateList colorStateList)
因此,必须从选择器中选择颜色,但这没有发生?
答案 0 :(得分:0)
问题是因为我在最初尝试这个例子的API 19上的GradientDrawable不支持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);
}
}
所以,状态没有改变,因为API 19上的方法isStateful GradientDrawable没有覆盖自己并且在它的父实现时返回false,并且如果方法是mSolidColors的状态,那么在API 24上将返回true,这是ColorStateList,返回真正。否则是假的。
@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个形状。