web-dev-qa-db-fra.com

Inclure les balises et dataBinding

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 TextViews.

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.

19
Milad Faridnia

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

36
Ravi Rupareliya

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'attributbindpour 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>
9
Deva

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

1
Lior