android kotlin 中的 customViews - 可以在 init 块中初始化吗?

android customViews in kotlin - is it ok to initialize in the init block?

我很困惑为什么没有人在 android 自定义视图中使用 init 块来初始化和扩充视图。让我们举个例子来说明我是怎么做到的:

class MyCompoundView : ConstraintLayout {
    constructor(p0: Context) : super(p0)
    constructor(p0: Context, p1: AttributeSet?) : super(p0, p1)
    constructor(p0: Context, p1: AttributeSet?, p2: Int) : super(p0, p1, p2)

    init {
        inflate(context, R.layout.my_view_container, this)
//etc
    }

}

与我在互联网上看到的相反,这有什么问题吗:

class MyCompoundView : ConstraintLayout {
    constructor(p0: Context) : super(p0){initialize()}

    constructor(p0: Context, p1: AttributeSet?) : super(p0, p1){initialize()}
    constructor(p0: Context, p1: AttributeSet?, p2: Int) : super(p0, p1, p2){initialize()}

 private fun initialize() {
        inflate(context, R.layout.ride_hail_otp_container, this)

    }

  }

ps。我不喜欢 customViews 中的 jvmOverload,所以无需提及。只想了解 init 块与在每个构造函数中调用它的对比。我看到没有人在网上这样做,我想知道为什么?

init 块中膨胀视图没有任何问题(我在自定义视图中这样做)就像 @JvmOVerloads.

没有任何问题一样

是的,完全没问题,我自己多次使用这种方法并且没有遇到任何问题。

  • 我目前正在使用的示例之一:

    class MaterialSearchBar (context: Context, val attributeSet: AttributeSet) : Toolbar(context, attributeSet) {
        init {
        inflate(context, R.layout.material_search_toolbar, this)
        updateUi()
        requestFocus()
        setUpListeners()
        }
    
    //...
    
    }