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.
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>
Il suffit de créer
<variable
pour transmettre des valeurs aux mises en page incluses.J'aime
app:passedText="@{@string/app_name}"
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
Pour la chaîne codée en dur:
Android:label="@{`Test 123`}"