Включить тег и привязку данных
Я хочу использовать один из своих макетов несколько раз в одном представлении, используя include
. Скажем, у меня есть custom.xml
, включая некоторые TextView
s.
custom.xml
:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:orientation="vertical" >
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Я включил этот макет несколько раз в parent.xml
:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<include layout="@layout/custom"
android:id="@+id/layout1"/>
<include layout="@layout/custom"
android:id="@+id/layout2"/>
</LinearLayout>
Теперь я хочу привязать свои модели данных к этому макету, но проблема в том, что я не знаю, как привязать две разные модели данных к layout1
и layout2
, поскольку оба они переопределены из одного макета, который custom.xml
. Насколько я знаю, я могу добавить этот тег в свой макет xml:
<data>
<variable name="user" type="com.myproject.model.User"/>
</data>
Но мне нужно привязать две разные модели данных к custom.xml
.
Мой вопрос заключается в том, как иметь включенную компоновку несколько раз в одном представлении и передавать разные данные им с помощью привязки данных? что-то вроде передачи данных в макет, но не статической привязки модели к xml.
Я также нашел этот вопрос, который имеет точно такую же проблему. Но поскольку Data Binding выпущен в более новых версиях android, я ищу способ решить ту же проблему используя привязку данных. Вот часть этого вопроса, который я процитировал для разъяснения:
Например, у меня есть тщательно обработанный макет, который я хочу отобразить три раза, на мой взгляд. Каждому из этих случаев понадобятся разные значения. Поскольку include
- это в основном прием XML и вставка его здесь мне нужно что-то более мощное.
Ответы
Ответ 1
Вы можете передать это из parent.xml
<include layout="@layout/custom"
android:id="@+id/layout1"
app:user="@{object of user1`}"/>
<include layout="@layout/custom"
android:id="@+id/layout2"
app:user="@{object of user2`}"/>
Здесь вам нужно передать User
объект из parent.xml
Убедитесь, что у вас есть <data>
в custom.xml
<data>
<variable name="user" type="com.myproject.model.User"/>
</data>
Здесь подробный ответ, связанный с этим, обратитесь к нему
Ответ 2
Мы знаем, как использовать имя POJO и его тип в XML, который мы используем в setContentView()
, в качестве родительского представления. Мы должны сосредоточиться на теге include
, если мы включаем любые макеты из ресурса следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="user"
type="exapmpe.model.User" />
</data>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include
layout="@layout/content_main"
bind:user="@{user}" />
</android.support.design.widget.CoordinatorLayout>
</layout>
Здесь мы используем атрибут bind
, чтобы передать объект, чтобы отобразить подробную информацию на экране содержимого. Убедитесь, что имя объекта должно быть одинаковым в обоих местах, например bind:user="@{user}
. content_main.xml
должен выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="user"
type="exapmpe.model.User" />
</data>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content_main" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName + user.lastName}" />
</RelativeLayout>
</layout>
Ответ 3
Проблема заключается в том, что включенный макет не рассматривается как привязанный к данным макет, взгляните здесь, чтобы не решить, как его решить