L'exemple ci-dessus fonctionne correctement, car la version 1.0-rc4 corrigé le problème du besoin de la variable inutile.
Je fais exactement comme il est décrit dans le documentation et cela ne fonctionne pas:
main.xml:
<layout xmlns:andr...
<data>
</data>
<include layout="@layout/buttons"></include>
....
buttons.xml:
<layout xmlns:andr...>
<data>
</data>
<Button
Android:id="@+id/button"
...." />
MyActivity.Java:
... binding = DataBindingUtil.inflate...
binding.button; ->cannot resolve symbol 'button'
comment obtenir le bouton?
Le problème est que la disposition incluse n'est pas considérée comme une disposition liée aux données. Pour le faire agir comme tel, vous devez passer une variable:
buttons.xml:
<layout xmlns:andr...>
<data>
<variable name="foo" type="int"/>
</data>
<Button
Android:id="@+id/button"
...." />
main.xml:
<layout xmlns:andr...
...
<include layout="@layout/buttons"
Android:id="@+id/buttons"
app:foo="@{1}"/>
....
Ensuite, vous pouvez accéder aux boutons indirectement via le champ des boutons:
MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.button
À partir de la version 1.0-rc4 (qui vient de paraître), vous n’avez plus besoin de la variable. Vous pouvez le simplifier pour:
buttons.xml:
<layout xmlns:andr...>
<Button
Android:id="@+id/button"
...." />
main.xml:
<layout xmlns:andr...
...
<include layout="@layout/buttons"
Android:id="@+id/buttons"/>
....
Il suffit de définir
id
sur la disposition incluse et d’utiliserbinding.includedLayout.anyView
.
Cet exemple aide à passer une valeur à <include
& accès aux vues incluses dans le code.
Tu as layout_common.xml
, voulez passer String
à la mise en page incluse.
Vous allez créer String
variable dans layout et vous référerz String
à TextView
.
<data>
// declare fields
<variable
name="passedText"
type="String"/>
</data>
<TextView
Android:id="@+id/textView"
...
Android:text="@{passedText}"/> //set field to your view.
Inclure cette mise en page à la mise en page parent. Donnez un id
à la mise en page incluse, pour que nous puissions l'utiliser dans la classe de liaison. Vous pouvez maintenant passer String passedText
à votre <include
tag.
activity_main.xml
<?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
..
>
<include
Android:id="@+id/includedLayout"
layout="@layout/layout_common"
app:passedText="@{@string/app_name}" // here we pass any String
/>
</LinearLayout>
</layout>
binding.includedLayout.textView
Dans votre classe.Vous pouvez transmettre toutes les variables à la disposition incluse, comme ci-dessus.
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.includedLayout.textView.setText("text");
Note Les deux mises en page (parent et inclus) doivent être binding layout
, enveloppé avec <layout
Une autre chose intéressante à ce sujet est que vous pouvez transférer des variables à la présentation importée à partir du classeur, comme ceci:
MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)
Vous pouvez faire en sorte que votre liaison fonctionne sur votre inclusion en y ajoutant simplement un ID, comme ceci:
<include
Android:id="@+id/loading"
layout="@layout/loading_layout"
bind:booleanVisibility="@{viewModel.showLoading}" />