Je souhaite utiliser l'une de mes présentations plusieurs fois dans la même vue à l'aide de include
. Disons que j'ai un custom.xml
comprenant quelques 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>
J'ai inclus cette mise en page plusieurs fois dans 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>
Maintenant, je veux lier mes modèles de données à cette présentation, mais le problème est que je ne sais pas comment lier deux modèles de données différents à layout1
et layout2
car ils sont tous deux référencés à partir d'une disposition qui est custom.xml
. Autant que je sache, je peux ajouter cette balise dans ma mise en page XML:
<data>
<variable name="user" type="com.myproject.model.User"/>
</data>
Mais je dois lier deux modèles de données différents à custom.xml
.
Ma question est de savoir comment avoir plusieurs fois une mise en page incluse dans une vue et leur transmettre différentes données à l'aide de la liaison de données? quelque chose comme passer des données à la mise en page mais pas lier statiquement un modèle à un fichier XML.
J'ai également trouvé this la question qui pose exactement le même problème, mais depuis que la liaison de données est disponible dans les versions plus récentes d'Android, je cherche un moyen de résoudre le même problème à l'aide de la liaison de données. Voici la partie de cette question que j'ai citée à des fins de clarification:
Par exemple, je souhaite afficher une mise en page soignée trois fois à mon avis. Chacune de ces instances aurait besoin de différentes valeurs. Puisque
include
est fondamentalement une prise de ce XML et collez-le ici, il me faudrait quelque chose de plus puissant.
Vous pouvez passer cela 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`}"/>
Ici, vous devez passer l'objet User
de parent.xml
Assurez-vous d'avoir <data>
dans custom.xml
<data>
<variable name="user" type="com.myproject.model.User"/>
</data>
Ici est la réponse détaillée liée à cela, référez-le
Nous savons comment utiliser le nom POJO et son type sur le XML que nous utilisons dans setContentView()
en tant que vue parent. Nous devrions nous concentrer sur la balise include
si nous incluons les présentations de la ressource comme suit:
<?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>
Ici, nous utilisons l'attributbind
pour transmettre l'objet et afficher les informations détaillées sur l'écran de contenu. Assurez-vous que le nom de l'objet doit être identique aux deux endroits, comme bind:user="@{user}
. Le content_main.xml
devrait ressembler à ceci:
<?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>
Le problème est que la mise en page incluse n'est pas conçue comme une mise en page liée aux données, jetez un coup d'oeil ici pour comprendre comment la résoudre