Android 4上的Android颜色选择器无法正常工作

4

我有一个定义好的Drawable资源(res/drawable/.xml),其中包含定义好的颜色资源(res/color/.xml)。颜色资源包含状态选择器。

在Android 5+上一切都可以正常工作,颜色状态选择器也可以正常工作。但在Android 4上无法工作。这是什么原因?如何解决?

布局:

<Button
    android:background="@drawable/btn_login"

drawable/btn_login.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <stroke
                android:width="@dimen/login_button_border"
                android:color="@color/btn_login_border" />
            <solid android:color="@color/btn_login_background" />
        </shape>
    </item>
    <item android:bottom="@dimen/login_button_border">
        <shape android:shape="rectangle">
            <stroke
                android:width="@dimen/login_button_border"
                android:color="@color/btn_login_background" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</layer-list>

color/btn_login_border.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/login_border_highlighted" android:state_pressed="true"/>
    <item android:color="@color/login_border"/>
</selector>

color/btn_login_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/login_button_highlighted" android:state_pressed="true"/>
    <item android:color="@color/login_button"/>
</selector>

请查看此答案:https://dev59.com/dmsz5IYBdhLWcg3wADS6#8169581 - paulina_glab
没有办法修复它吗?只能使用StateListDrawable吗?这真让人恼火。 - Maxian Nicu
1个回答

4

由于ColorStateList在Lollipop版本之前不支持,您可以像这样重新组织显示资源:

drawable/btn_login.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/login_button_highlighted" android:state_pressed="true"/>
    <item android:drawable="@drawable/login_button"/>
</selector>

drawable/btn_login_normal.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <stroke
                android:width="@dimen/login_button_border"
                android:color="@color/login_border" />
            <solid android:color="@color/login_button" />
        </shape>
    </item>
    <item android:bottom="@dimen/login_button_border">
        <shape android:shape="rectangle">
            <stroke
                android:width="@dimen/login_button_border"
                android:color="@color/login_button" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</layer-list>

drawable/btn_login_highlihted.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <stroke
                android:width="@dimen/login_button_border"
                android:color="@color/login_border_highlighted" />
            <solid android:color="@color/login_button_highlighted" />
        </shape>
    </item>
    <item android:bottom="@dimen/login_button_border">
        <shape android:shape="rectangle">
            <stroke
                android:width="@dimen/login_button_border"
                android:color="@color/login_button_highlighted" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</layer-list>

这将消除在此情况下使用颜色选择器的必要性。

1
是的,这是解决问题的正确方法。尽管它会使可绘制对象变得更加复杂和难以维护。 - Maxian Nicu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接