android - name - Incluir etiqueta y enlace de datos
meta tags generator (3)
Quiero usar uno de mis diseños varias veces en la misma vista usando include
. Digamos que tengo un custom.xml
incluye algunos 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>
He incluido este diseño varias veces en 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>
Ahora quiero vincular mis modelos de datos a este diseño, pero el problema es que no sé cómo vincular dos modelos de datos diferentes a layout1
y layout2
ya que ambos están referenciados desde un diseño que es custom.xml
. Por lo que sé, puedo agregar esta etiqueta en mi diseño xml:
<data>
<variable name="user" type="com.myproject.model.User"/>
</data>
Pero necesito enlazar dos modelos de datos diferentes a custom.xml
.
Mi pregunta es ¿cómo tener un diseño incluido varias veces en una vista y pasarles datos diferentes mediante el enlace de datos? algo así como pasar datos al diseño pero no vincular estáticamente un modelo a un xml.
También encontré this pregunta que tiene exactamente el mismo problema. Pero dado que Data Binding se lanza en versiones más recientes de Android, estoy buscando una manera de resolver el mismo problema utilizando Data Binding. Aquí está la parte de esa pregunta que he citado para aclarar:
Por ejemplo, tengo un diseño cuidadosamente diseñado que quiero mostrar tres veces en mi vista. Cada uno de esos casos necesitaría valores diferentes. Como la
include
es básicamente una toma de ese XML y péguelo aquí, necesitaría algo más poderoso.
El problema es que el diseño incluido no se considera un diseño enlazado a datos, Here para entender cómo resolverlo
Puedes pasar eso de 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`}"/>
Aquí necesitas pasar el objeto de User
de parent.xml
Asegúrate de tener <data>
en custom.xml
<data>
<variable name="user" type="com.myproject.model.User"/>
</data>
Here está la respuesta detallada relacionada con esto, refiérase
Sabemos cómo usar el nombre de POJO y su tipo en el XML que usamos en setContentView()
como vista principal. Deberíamos centrarnos en la etiqueta de include
si incluimos los diseños del recurso de la siguiente manera:
<?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>
Aquí hemos utilizado el atributo de bind
para pasar el objeto para mostrar la información detallada en la pantalla de contenido. Asegúrese de que el nombre del objeto sea el mismo en ambos lugares, como bind:user="@{user}
. El content_main.xml
debe tener el siguiente aspecto:
<?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>