Как динамически изменять выражение макета в макете привязки данных?

#android #data-binding #android-databinding

Вопрос:

Допустим, у меня есть макет привязки данных, который выглядит примерно так,

 <layout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    <data>
        <variable
            name="foo"
            type="com.example.sudokugame.Foo" />
    </data>
    ...

        <TextView
            android:id="@ id/cell_1"
            style="@style/cell"
            android:text="@{foo.bar}" />
    ...
</layout>
 

Я хочу раздуть макет и добавить его в другой родительский макет. Итак, мой вопрос в том, есть ли возможность изменить выражение макета в textview, чтобы оно выглядело примерно так,

 ...
<TextView
    android:id="@ id/cell_1"
    style="@style/cell"
    android:text="@{foo.baz}" <!-- or something else like foo.something -->
....
 

Возможно ли это? И если нет, то есть ли какой-либо способ создать макет привязки данных полностью программно, даже не определяя макет XML, чтобы его можно было добавить в другой макет?

Ответ №1:

Для этого используйте адаптеры привязки. Вот как вы можете это сделать,

 @BindingAdapter("dynamicText")
fun TextView.setDynamicText(foo: Foo) {
    text = if (<your_condition>) {
        foo.bar;
    } else {
        foo.something;
    }
}
 

Теперь измените свое textview свойство xml на,

 <TextView
        android:id="@ id/cell_1"
        style="@style/cell"
        android:dynamicText="@{foo}" />