Привязка данных 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 ответа:
проблема в том, что включенный макет не рассматривается как макет с привязкой к данным. Чтобы он действовал как один, вам нужно передать переменную:
кнопки.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