Android selector中设置 android:state_enabled 不起作用问题的解决

因为要为button设置不同状态下不同的背景,写了一个selector,如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/pic_01" android:state_pressed="true"></item>
    <item android:drawable="@mipmap/pic_02" android:state_pressed="false"></item>
    <item android:drawable="@drawable/shape_square" android:state_enabled="false"/>
</selector>

但是在使用时,设置 button.setEnabled(false)背景却无任何变化。

试着把state_enabled放在最前面:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/shape_square" android:state_enabled="false"/>
    <item android:drawable="@mipmap/pic_01" android:state_pressed="true"></item>
    <item android:drawable="@mipmap/pic_02" android:state_pressed="false"></item>
</selector>

这样再设置button.setEnable(false)背景显示正常了。Why???

查了相关资料发现:

selector中各个item的顺序是会影响实际效果的(敲黑板!!!)

selector的item从上到下是按照匹配原则来改变状态的,一旦匹配到某个item的状态,就不会继续往下匹配。

例如:

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

这样设置 button按下就会有背景上的变化。然而,如果item换一下顺序:

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

这样再把button按下 背景不会有任何变化。

当<item android:drawable="@drawable/normal"/>这个item在第一个,就匹配了按钮正常的状态,然后就不会往下匹配,也就是说下面那个press的item将永远不会被执行。这就是 一旦匹配到某个item的状态,就不会继续往下匹配这句话的意思。

再举一个例子:

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

点击按钮时会看到按钮的高亮状态,然后又恢复正常,这一过程执行的动作是:“点击”,在手指离开按钮之后 第二条` <item android:state_pressed="false" android:drawable="@drawable/background_pressed" > `肯定会满足匹配条件,所以后面的`item`都不会执行。

重点:一旦匹配到某个item的状态,就不会继续往下匹配!!

 

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值