Kotlin Synthetic: привязка видов с одинаковыми идентификаторами в нескольких макетах с динамическим надуванием - PullRequest
0 голосов
/ 03 октября 2018

У меня есть два макета: 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 для этого?

1 Ответ

0 голосов
/ 04 октября 2018

Если вы хотите импортировать разные виджеты с одним и тем же идентификатором с помощью Kotlin Synthetic, вы можете использовать их псевдонимы при импорте:

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"
...