Установить ColorStateList для фигуры не работают - PullRequest
0 голосов
/ 14 мая 2018

У меня есть эта форма

<?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 голосов
/ 15 мая 2018

Проблема в том, что 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 фигуры для изменения состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...