使用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)
}
}
网友评论