@JvmOverloads 注解是用来干嘛的?
如果方法参数中有默认值的,那么这个注解可以帮我们生成多个重载方法,这样方便我们调用,可以省掉一些不关心的参数。
如果我们这样写,会生成三个重载方法,这里的坑并不在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 的坑