Android CustomViews в Kotlin - это нормально для инициализации в блоке инициализации? - PullRequest
0 голосов
/ 15 июня 2019

Я так растерялся, почему никто не использует блок инициализации в пользовательском представлении Android для инициализации и раздувания представления. Давайте рассмотрим пример того, как я это делаю:

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)

    }

  }

пс. я не одобряю jvmOverload в customViews, поэтому нет необходимости упоминать это. просто хочу знать о блоке инициализации против вызова его в каждом конструкторе. Я не вижу, чтобы кто-то делал это онлайн, и мне интересно, почему?

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Да, это совершенно нормально, я сам использовал этот подход много раз и не столкнулся с какими-либо проблемами.

  • один из примеров, с которыми я сейчас работаю:

    class MaterialSearchBar (context: Context, val attributeSet: AttributeSet) : Toolbar(context, attributeSet) {
        init {
        inflate(context, R.layout.material_search_toolbar, this)
        updateUi()
        requestFocus()
        setUpListeners()
        }
    
    //...
    
    }
    
0 голосов
/ 15 июня 2019

Нет ничего плохого в том, чтобы надувать представление в блоке init (я делаю это в своих пользовательских представлениях), точно так же, как нет ничего плохого в @JvmOVerloads.

...