Как получить доступ к аргументу конструктора, который не является переменной-членом в функции init?

У меня есть пользовательский макет, как показано ниже.

class CustomComponent : FrameLayout { constructor(context: Context?) : super(context) constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { initAttrs(attrs) } constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { initAttrs(attrs) } constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) { initAttrs(attrs) } init { LayoutInflater.from(context).inflate(R.layout.view_custom_component, this, true) } fun initAttrs(attrs: AttributeSet?) { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.custom_component_attributes, 0, 0) my_title.text = resources.getText(typedArray .getResourceId(R.styleable.custom_component_attributes_custom_component_title, R.string.component_one)) typedArray.recycle() } } 

Теперь для каждого конструктора я должен явно вызвать initAttrs(attrs) поскольку я не могу найти способ доступа к attrs в моей функции init .

Есть ли способ получить доступ к attrs в функции init , поэтому я мог бы вызвать initAttrs(attrs) из init вместо того, чтобы явно вызвать его в каждом из конструкторов?

Используйте конструктор с аргументами по умолчанию:

 class CustomComponent @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyle: Int = 0 ) : FrameLayout(context, attrs, defStyle) { fun init { // Initialize your view } } 

Аннотация @JvmOverloads сообщает Kotlin о создании трех перегруженных конструкторов, чтобы их можно было вызывать и на Java.

В вашей функции init attrs становится доступным как тип с нулевым значением:

 fun init { LayoutInflater.from(context).inflate(R.layout.view_custom_component, this, true) attrs?.let { val typedArray = context.obtainStyledAttributes(it, R.styleable.custom_component_attributes, 0, 0) my_title.text = resources.getText(typedArray .getResourceId(R.styleable.custom_component_attributes_custom_component_title, R.string.component_one)) typedArray.recycle() } } 

Обратите внимание на его использование в блоке let .