为形状设置ColorStateList不起作用

时间:2018-05-14 17:13:45

标签: android-drawable

我有这种形状

<?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)

因此,必须从选择器中选择颜色,但这没有发生?

1 个答案:

答案 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个形状。