Kotlin自定义View中@JvmOverloads的坑

@JvmOverloads 注解是用来干嘛的?

如果方法参数中有默认值的,那么这个注解可以帮我们生成多个重载方法,这样方便我们调用,可以省掉一些不关心的参数。


image.png
image.png

如果我们这样写,会生成三个重载方法,这里的坑并不在JvmOverloads注解本身,而在defStyleAttr。修改defStyleAttr的时候我们会覆盖掉父类对defStyleAttr的默认样式。

坑在哪

我们一般会写成下面这样

class MyEditText @JvmOverloads constructor(
context: Context?, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : EditText(context, attrs, defStyleAttr)

当defStyleAttr在这里写成0的时候,我们重写了EditText的默认样式,这样会导致EditText焦点没有了的,点击之后键盘也无法弹起。

自定义view时的一点建议

在自定义view时去父类瞅一眼,看看父类的defStyleAttr怎么定义的。
如果我们不用修改样式,就不要重写defStyleAttr,只定义(context: Context?, attrs: AttributeSet? = null)两个参数就可以了。
代码如下,顺带给EditText加了个灰色底色。加底色的逻辑具体看View绘制顺序

class MyEditText @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null) : EditText(context, attrs){
    override fun draw(canvas: Canvas?) {
        canvas?.drawARGB(100,0,0,0)
        super.draw(canvas)
    }
}
链接

Kotlin @JvmOverloads 自定义 View 的坑

你可能感兴趣的:(Kotlin自定义View中@JvmOverloads的坑)