web-dev-qa-db-fra.com

Android Liaison de données à l'aide de la balise include

Note de mise à jour:

L'exemple ci-dessus fonctionne correctement, car la version 1.0-rc4 corrigé le problème du besoin de la variable inutile.

Question originale:

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?

86
Kamil Nekanowicz

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"/>
....
161
George Mount

Exemple complet facile

Il suffit de définir id sur la disposition incluse et d’utiliser binding.includedLayout.anyView.

Cet exemple aide à passer une valeur à <include & accès aux vues incluses dans le code.

Étape 1

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.

Étape 2

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>
  • Vous pouvez utiliser maintenant 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

22
Khemraj

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)
2

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}" />
0
Rodrigo Salomao