tag name manager keywords google etiquetas ejemplos description android xml android-layout android-databinding

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>