我有一个自定义布局,如下所示
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
,而不必在每个构造函数中显式调用它?
答案 0 :(得分:8)
使用带有默认参数的构造函数:
{% for orgdetail in object_list %}
{{ orgdetail.detail_1 }}
{{ orgdetail.org.name }}
{% endfor %}
class CustomComponent @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : FrameLayout(context, attrs, defStyle) {
fun init {
// Initialize your view
}
}
注释告诉Kotlin生成三个重载的构造函数,因此也可以用Java调用它们。
在@JvmOverloads
函数中,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()
}
}
块中it
的使用情况。