Android Kotlin自定义View子类化致EditText等控件变灰失焦问题
以下是针对该问题的具体排查和解决方向:
检查构造函数的完整实现
Kotlin自定义View必须覆盖所有父类的构造函数,否则XML布局初始化控件时可能调用错误的构造逻辑,导致样式和状态异常。以AppCompatEditText为例,正确的Kotlin构造实现需用@JvmOverloads注解自动生成重载构造,同时严格匹配父类的参数默认值:class CustomEditText @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.editTextStyle ) : AppCompatEditText(context, attrs, defStyleAttr)这个注解会生成Java风格的三个重载构造,和Java版本的自定义View构造逻辑保持一致,避免因构造不匹配导致的控件初始化失败。
确认主题样式参数传递正确
自定义View的第三个构造参数defStyleAttr决定了控件默认加载的主题样式,必须和父类保持一致。比如SeekBar的默认defStyleAttr是android.R.attr.seekBarStyle,传错值会导致控件无法正确应用主题样式,出现变灰、交互失效的情况。排查是否误重写了状态相关方法
检查自定义View类中是否意外重写了isEnabled()、isFocusable()、onTouchEvent()或onFocusChanged()这类方法,若返回值错误(比如isEnabled()返回false),会直接导致控件变灰且无法获取焦点。迁移代码时容易误复制Java中的部分逻辑,需仔细核对。验证XML布局的控件引用和属性
确保XML中引用的自定义View全类名正确(比如com.yourapp.ui.CustomEditText),同时检查控件是否被意外设置了android:enabled="false"、android:focusable="false"或android:clickable="false"这类属性,这些都会直接影响控件的交互状态。清理项目缓存并重建
Kotlin与Java混编或迁移过程中,Android Studio的缓存可能引发奇怪的初始化异常。尝试执行Build -> Clean Project,再Build -> Rebuild Project,或者通过File -> Invalidate Caches...清理缓存后重启,排除缓存导致的问题。
内容的提问来源于stack exchange,提问作者Abdo21

