Android Data Binding: как передать переменную, чтобы включить макет

В документации Google говорится, что переменные могут быть переданы во включенную привязку макета из содержащего макета, но я не могу заставить его работать, но получить ошибку привязки данных **** msg: Идентификаторы должны иметь определенные пользователем типы из XML файла. обработчик не хватает. Входящий XML выглядит следующим образом:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">

<data>
    <import type="com.example.FocusChangeHandler"/>

    <variable
        name="handler"
        type="FocusChangeHandler"/>
</data>

<!-- Some other views  --->

   <include
            android:id="@+id/inputs"
            layout="@layout/input_fields"
            bind:handler="@{handler}"/>        
</layout>

И включенный XML вот так:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<EditText
   android:id="@+id/nameEdit"       
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"       
   android:onFocusChange="@{handler.onFocusChange}"/>
</layout>

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

Ответ 1

В документации уточняется

Здесь должна быть переменная пользователя в файлах макетов name.xml и contact.xml

Я предполагаю, что вы должны иметь это в вашем включенном макете:

    <data>
           <variable name="handler"
                     type="FocusChangeHandler"/>
    </data>

Ответ 2

Просто создайте <variable для передачи значений во включенные макеты.

Как и app:passedText="@{@string/app_name}"

пример

Как я хочу передать String для включенного макета. Я создам переменную типа String. Отнесите эту String к вашему TextView. Я создал passedText для примера.

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    >

    <data>
        // declare fields
        <variable
            name="passedText"
            type="String"/>
    </data>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{passedText}"/> //set field to your view.

</layout>

Теперь добавьте поле passedText в тэг <include.

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <include
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>

Обратите внимание, что оба макета (родительский и включенный) должны быть binding layout, завернутым в <layout

Ответ 3

Для жестко закодированной строки:

 android:label="@{'Test 123'}"