Привязка данных Android с помощью тега include
Примечание:
приведенный выше пример работает, потому что релиз 1.0-rc4 основные проблема необходимости ненужной переменной.
исходный вопрос:
я делаю точно так, как это описано в документация и это не работает:
main.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"
...." />
main.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"
...." />
main.XML-код:
<layout xmlns:andr...
...
<include layout="@layout/buttons"
android:id="@+id/buttons"/>
....
пример
просто набор
id
в комплекте макет, и использоватьbinding.includedLayout.anyView
.
в этом примере показано значение pass для <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)