Привязка данных Android с использованием тега include


Примечание:

приведенный выше пример работает, потому что релиз 1.0-rc4 основные проблема необходимости ненужной переменной.

исходный вопрос:

я делаю именно так, как описано в документация и это не работает:

главная.XML-код:

<layout xmlns:andr...
    <data>
    </data>
       <include layout="@layout/buttons"></include>
....

кнопки.XML-код:

<layout xmlns:andr...>
    <data>
    </data>
    <Button
        android:id="@+id/button"
        ...." />

MyActivity.java:

 ... binding = DataBindingUtil.inflate...
binding.button; ->cannot resolve symbol 'button'

как получить Баттон?

3 58

3 ответа:

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

кнопки.XML-код:

<layout xmlns:andr...>
  <data>
    <variable name="foo" type="int"/>
  </data>
  <Button
    android:id="@+id/button"
    ...." />

главная.XML-код:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"
            app:foo="@{1}"/>
....

затем вы можете получить доступ к кнопкам косвенно через поле кнопок:

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.button

начиная с 1.0-rc4 (только что выпущено), вам больше не нужна переменная. Вы можете упростить его к:

кнопки.XML-код:

<layout xmlns:andr...>
  <Button
    android:id="@+id/button"
    ...." />

главная.XML-код:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"/>
....

пример

просто набор id чтобы включить макет, и использовать binding.includedLayout.anyView.

в этом примере показано значение передачи в <include & доступ к включенным представлениям.

у меня есть общее мнение layout_common.xml, я хочу 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:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{passedText}"/> //set field to your view.

</layout>

теперь вы можете пройти passedText поле для вашего <include тег.

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

activity_main.xml

<?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
            android:id="@+id/includedLayout"
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>

теперь вы можете использовать binding.includedLayout.textView в своем классе.

ActivityMainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.includedLayout.textView.setText("text");

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

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

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)