美文网首页
Kotlin中使用@ JvmOverloads时莫名其妙的错误

Kotlin中使用@ JvmOverloads时莫名其妙的错误

作者: shiyuzhe | 来源:发表于2019-05-31 16:15 被阅读0次

使用kotlin自定义的时候慎用JvmOverloads。当然,用起来就不想回去的,所以我们说的使用时要注意。
⚠️构造方法中defStyleAttr参数在有的父类中有默认值,我们不能简单使用0作为默认参数,这样构造出来的view会闹幺蛾子,动手试试吧

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

 public EditText(Context context) {
    this(context, null);
}

public EditText(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.editTextStyle);
}

public EditText(Context context, AttributeSet attrs, int defStyleAttr) {
    this(context, attrs, defStyleAttr, 0);
}

public EditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}
链接

墙内
墙外

推荐

记得在自定义view时去父类瞅一眼,千万不要覆盖掉父类的defStyleAttr。
我是想写三个参数的,但我拿com.android.internal.R.attr.editTextStyle会报错,考虑到不会去改变EditText的defStyleAttr就写了两个参数。
代码如下,顺带给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时莫名其妙的错误

      本文链接:https://www.haomeiwen.com/subject/nvhgtctx.html