Kotlin自定義View中@JvmOverloads的坑

@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)
    }
}
鏈接

Kotlin @JvmOverloads 自定義 View 的坑

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容