如何访问init函数中不是成员变量的构造函数参数?

时间:2017-05-27 06:58:21

标签: android kotlin

我有一个自定义布局,如下所示

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,而不必在每个构造函数中显式调用它?

1 个答案:

答案 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的使用情况。