Android自定义Switch thumb的selector中state_enabled不生效
问题原因
StateListDrawable(即XML定义的selector)的匹配逻辑是严格按item书写顺序从上到下匹配,第一个满足状态条件的item会被直接渲染,后续条目不再参与匹配。
你当前代码里的前两个item仅声明了android:state_checked属性,未对state_enabled做任何约束——这类item的匹配规则是:只要控件当前checked状态和item声明的值一致,无论控件是启用、禁用、按压还是聚焦状态,都会直接命中该item。因此排在最后的android:state_enabled="false"条目永远不会被匹配到。
修复方法
将所有和禁用状态相关的item移动到selector的最顶部,优先匹配禁用规则;如果需要区分禁用状态下的选中/未选中样式,需要同时给禁用item加上对应的state_checked属性,如果不需要区分,单写禁用状态item即可。
修正后的selector代码参考:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 禁用状态规则优先匹配,放在最前 --> <!-- 不需要区分禁用下的选中态的话,只保留下面这一条禁用item即可 <item android:state_enabled="false"> <shape android:shape="oval"> <size android:width="24dp" android:height="24dp"/> <solid android:color="@color/black"/> </shape> </item> --> <!-- 区分禁用下的选中/未选中样式时用下面两条 --> <item android:state_enabled="false" android:state_checked="true"> <shape android:shape="oval"> <size android:width="24dp" android:height="24dp"/> <solid android:color="@color/light_green"/> <!-- 禁用选中态颜色,可按需替换 --> </shape> </item> <item android:state_enabled="false" android:state_checked="false"> <shape android:shape="oval"> <size android:width="24dp" android:height="24dp"/> <solid android:color="@color/black"/> </shape> </item> <!-- 启用状态规则放在后面 --> <item android:state_checked="true"> <shape android:shape="oval"> <size android:width="24dp" android:height="24dp"/> <solid android:color="@color/green"/> </shape> </item> <item android:state_checked="false"> <shape android:shape="oval"> <size android:width="24dp" android:height="24dp"/> <solid android:color="@color/red"/> </shape> </item> </selector>
注意:selector里item的状态约束是“与”逻辑,即item上声明的所有状态必须同时满足才会命中;未声明的状态不做校验。书写时永远把约束条件多、优先级高的规则放在最前面,通用、约束少的规则放在后面。
内容的提问来源于stack exchange,提问作者HeraGonz
相关产品推荐
相关产品推荐

