@JvmOverloads 注解是用來干嘛的?
如果方法參數(shù)中有默認值的,那么這個注解可以幫我們生成多個重載方法,這樣方便我們調(diào)用,可以省掉一些不關心的參數(shù)。

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)兩個參數(shù)就可以了。
代碼如下,順帶給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)
}
}