自定义状态下Selector Drawable不更新问题求助
自定义View状态不生效的问题修复
核心问题点
- 未解析XML中的初始属性值:自定义View构造函数里没有读取
app:state_fluctuate的属性值,导致初始化时状态始终为默认的false,XML配置完全无效。 - Drawable选择器状态写法错误:自定义状态不能通过
app:state_fluctuate="true/false"的方式匹配,Android的Selector是通过状态是否存在来判断布尔型自定义状态的,而非直接赋值布尔值。
修复步骤
1. 修复自定义View类,添加属性解析
在构造函数中读取XML设置的初始状态,并优化状态刷新逻辑:
class BankErrorSelectorView(context: Context, attrs: AttributeSet?) : ConstraintLayout(context, attrs) { private var isStateFluctuate = false init { // 解析XML中的自定义属性 attrs?.let { val typedArray = context.obtainStyledAttributes(it, R.styleable.BankErrorSelectorView) isStateFluctuate = typedArray.getBoolean(R.styleable.BankErrorSelectorView_state_fluctuate, false) typedArray.recycle() } } override fun onCreateDrawableState(extraSpace: Int): IntArray { // 先获取父类的状态数组,预留额外空间 val drawableState = super.onCreateDrawableState(extraSpace + 1) // 如果状态为true,合并自定义状态 if (isStateFluctuate) { mergeDrawableStates(drawableState, STATE_FLUCTUATE) } return drawableState } fun setBankErrorState(state: Boolean) { // 仅当状态变化时才刷新,避免不必要的重绘 if (isStateFluctuate != state) { isStateFluctuate = state refreshDrawableState() } } companion object { private val STATE_FLUCTUATE = intArrayOf(R.attr.state_fluctuate) } }
2. 修复Drawable选择器的状态匹配逻辑
自定义状态在Selector中需通过android:state="@attr/状态名"匹配“状态存在”的情况,默认情况匹配“状态不存在”:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 当state_fluctuate状态激活时,显示红色边框 --> <item android:state="@attr/state_fluctuate" android:drawable="@drawable/border_rectangle_red" /> <!-- 默认状态(state_fluctuate未激活)显示黄色边框 --> <item android:drawable="@drawable/border_rectangle_yellow" /> </selector>
验证说明
- XML中设置
app:state_fluctuate="true"时,View会初始显示红色边框;设置为false则显示黄色边框。 - 调用
setBankErrorState(true/false)时,状态会立即切换并刷新UI。
内容的提问来源于stack exchange,提问作者Ishika Singh
相关产品推荐
相关产品推荐

