Kotlin Synthetic:在动态布局中引用具有多个布局的相同ID的视图

时间:2018-10-03 18:46:04

标签: android kotlin kotlin-android-extensions

我有两种布局:data_a.xml和data_b.xml。它们都显示相同的数据,但布局不同。两种布局都有一个TextView,其ID为data_label

我的自定义视图DataView允许根据具有Styleable属性的layout来膨胀data_a.xml或data_b.xml来呈现我的数据。

DataView.kt:

class DataView(context: Context?, attrs: AttributeSet?) : ConstraintLayout(context, attrs) {

    init {
        var layoutResId = R.layout.data_a
        if (attrs != null) {
            val a = context?.theme?.obtainStyledAttributes(attrs, R.styleable.DataView, 0, 0)
            try {
                layoutResId = a!!.getResourceId(R.styleable.DataView_layout, layoutResId)
            } finally {
                a?.recycle()
            }
        }
        View.inflate(context, layoutResId, this)
        data_label.text = "Foobar" // this won't work if I choose data_b.xml as layout
    }
}

attrs.xml:

<declare-styleable name="DataView">
    <attr name="layout" format="reference"/>
</declare-styleable>

这就是我选择使用哪种布局的方法:

<?xml version="1.0" encoding="utf-8"?>
    ...
    <com.duh.DataView
        android:id="@+id/data_view"
        app:layout="@layout/data_a"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

有没有办法使用Kotlin Synthetic来做到这一点?

1 个答案:

答案 0 :(得分:2)

如果您要使用Kotlin Synthetic导入具有相同ID的不同小部件,则可以在导入中为其添加别名:

import kotlinx.android.synthetic.main.data_a.view.data_label as labelA
import kotlinx.android.synthetic.main.data_b.view.data_label as labelB

然后在您的DataView中,您可以将文本分配给不为空的TextView,具体取决于您所使用的布局:

(labelA ?: labelB)?.text = "Foobar"