web-dev-qa-db-fra.com

Liaison de données Android: comment passer variable à inclure la mise en page

La documentation de Google indique que les variables peuvent être passées dans la liaison d'une présentation incluse à partir de la présentation correspondante, mais je ne peux pas le faire fonctionner, mais obtenir une erreur de liaison de données. gestionnaire le manque. Le code XML inclusif ressemble à ceci:

<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:bind="http://schemas.Android.com/apk/res-auto">

<data>
    <import type="com.example.FocusChangeHandler"/>

    <variable
        name="handler"
        type="FocusChangeHandler"/>
</data>

<!-- Some other views  --->

   <include
            Android:id="@+id/inputs"
            layout="@layout/input_fields"
            bind:handler="@{handler}"/>        
</layout>

Et le XML inclus ressemble à ceci: 

<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<EditText
   Android:id="@+id/nameEdit"       
   Android:layout_width="wrap_content"
   Android:layout_height="wrap_content"       
   Android:onFocusChange="@{handler.onFocusChange}"/>
</layout>

Je suis en mesure de faire référence aux vues de la disposition incluse via la classe de liaison générée, mais le passage d'une variable ne fonctionne tout simplement pas. 

12
pmellaaho

La documentation spécifie

Ici, il doit y avoir une variable utilisateur dans les fichiers de mise en forme name.xml et Contact.xml

Je suppose que vous devriez avoir ceci dans votre mise en page incluse:

    <data>
           <variable name="handler"
                     type="FocusChangeHandler"/>
    </data>
6
Batgard

Il suffit de créer <variable pour transmettre des valeurs aux mises en page incluses. 

J'aimeapp:passedText="@{@string/app_name}"

Exemple

Comme si je voulais passer String à la disposition incluse. Je vais créer une variable de type String. Reportez cette String à votre TextView. J'ai créé passedText par exemple.

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    >

    <data>
        // declare fields
        <variable
            name="passedText"
            type="String"/>
    </data>

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@{passedText}"/> //set field to your view.

</layout>

Ajoutez maintenant le champ passedText à votre balise <include.

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        >

        <include
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>

Notez que les deux présentations (parent et incluse) doivent être binding layout, entourées de <layout

2
Khemraj

Pour la chaîne codée en dur:

 Android:label="@{`Test 123`}"
0
Gene Bo