You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义状态下Selector Drawable不更新问题求助

自定义View状态不生效的问题修复

核心问题点

  1. 未解析XML中的初始属性值:自定义View构造函数里没有读取app:state_fluctuate的属性值,导致初始化时状态始终为默认的false,XML配置完全无效。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:47:04