У меня есть два макета: data_a.xml и data_b.xml.Они оба созданы для отображения одних и тех же данных, но расположены по-разному.Оба макета имеют TextView
с идентификатором data_label
.
Мое пользовательское представление DataView
позволяет раздувать data_a.xml или data_b.xml для рендеринга моих данных, в зависимости от Styleable
, имеющего layout
атрибут.
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 для этого?