Classes de liaison générées

La bibliothèque Data Binding génère des classes de liaison que vous pouvez utiliser pour accéder variables et vues de la mise en page. Cette documentation explique comment créer et personnaliser les classes de liaison générées.

La classe de liaison générée associe les variables de mise en page aux vues incluses dans le mise en page. Vous pouvez personnaliser le nom et le package de la liaison. Toutes les classes de liaison générées héritent du ViewDataBinding.

Une classe de liaison est générée pour chaque fichier de mise en page. Par défaut, le nom est le nom du fichier de mise en page converti en casse Pascal avec la liaison. qui lui a été ajouté. Ainsi, par exemple, si le nom de fichier de la mise en page est activity_main.xml, la classe générée correspondante est ActivityMainBinding. Cette classe contient toutes les liaisons des propriétés de mise en page vers le composant et sait comment attribuer des valeurs aux expressions de liaison.

Créer un objet de liaison

L'objet de liaison est créé immédiatement après avoir gonflé la mise en page que la hiérarchie des vues n'est pas modifiée avant de s'associer aux vues avec dans la mise en page. La méthode la plus courante pour lier l'objet à consiste à utiliser les méthodes statiques sur la classe de liaison. Vous pouvez gonfler le la hiérarchie des vues et liez l'objet à celui-ci à l'aide de la méthode inflate() de binding, comme illustré dans l'exemple suivant:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater)

    setContentView(binding.root)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());

    setContentView(binding.root);
}

Il existe une autre version de la méthode inflate() qui accepte un ViewGroup en plus de l'objet LayoutInflater , en tant que illustré dans l'exemple suivant:

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)

Java

MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);

Si la mise en page est gonflée à l'aide d'un autre mécanisme, vous pouvez la lier séparément, comme suit:

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)

Java

MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);

Parfois, vous ne connaissez pas le type de liaison à l'avance. Dans ce cas, vous pouvez créez la liaison à l'aide de la méthode la classe DataBindingUtil, comme illustré dans l'extrait de code suivant:

Kotlin

val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent)
val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)

Java

View viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent);
ViewDataBinding binding = DataBindingUtil.bind(viewRoot);

Si vous utilisez des éléments de liaison de données dans un Fragment, ListView ou RecyclerView vous pouvez utiliser l'adaptateur inflate() des classes de liaisons ou de la classe DataBindingUtil, en tant que illustré dans l'exemple de code suivant:

Kotlin

val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)

Java

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
// or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

Vues avec ID

La bibliothèque Data Binding crée un champ immuable dans la classe de liaison pour chaque vue ayant un ID dans la mise en page. Par exemple, la bibliothèque Data Binding crée les champs firstName et lastName de type TextView à partir de mise en page suivante:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
   android:id="@+id/firstName"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"
  android:id="@+id/lastName"/>
   </LinearLayout>
</layout>

La bibliothèque extrait les vues, y compris les ID, de la hiérarchie des vues dans une en un seul geste. Ce mécanisme peut être plus rapide que l'appel findViewById() pour chaque vue de la mise en page.

Les identifiants ne sont pas aussi nécessaires qu'ils le sont sans liaison de données, mais il existe dans certains cas où l'accès aux vues est nécessaire à partir du code.

Variables

La bibliothèque Data Binding génère des méthodes d'accesseur pour chaque variable déclarée dans la mise en page. Par exemple, la mise en page suivante génère un setter et un getter dans la classe de liaison pour les variables user, image et note:

<data>
   <import type="android.graphics.drawable.Drawable"/>
   <variable name="user" type="com.example.User"/>
   <variable name="image" type="Drawable"/>
   <variable name="note" type="String"/>
</data>

Tubes d'affichage

Contrairement aux vues normales, les objets ViewStub comme des vues invisibles. Quand elles sont rendues visibles ou explicitement gonflées, ils se remplacent dans la mise en page en gonflant une autre mise en page.

Comme le ViewStub disparaît de la hiérarchie des vues, la vue dans la l'objet de liaison doit également disparaître pour qu'il puisse être revendiqué par la récupération de mémoire. Comme les vues sont définitives, Objet ViewStubProxy remplace ViewStub dans la classe de liaison générée, ce qui vous donne accès au ViewStub lorsqu'il existe et accès à la vue gonflée la hiérarchie lorsque ViewStub est gonflé.

Lorsque vous gonflez une autre mise en page, une liaison doit s'établir pour la nouvelle mise en page. Par conséquent, le ViewStubProxy doit écouter ViewStub OnInflateListener et établissez la liaison si nécessaire. Étant donné qu'un seul écouteur peut exister au niveau l'heure, ViewStubProxy vous permet de définir un OnInflateListener, qu'il appelle après avoir établi la liaison.

Liaison immédiate

Lorsqu'une variable ou un objet observable change, la liaison est programmée pour changer. avant le cadre suivant. Cependant, il arrive que la liaison soit exécutée immédiatement. Pour forcer l'exécution, utilisez la méthode executePendingBindings() .

Variables dynamiques

La classe de liaison spécifique est parfois inconnue. Par exemple, un RecyclerView.Adapter l’opération avec des mises en page arbitraires ne connaît pas la classe de liaison spécifique. Il doit attribuer la valeur de liaison lors de l'appel à la méthode onBindViewHolder() .

Dans l'exemple suivant, toutes les mises en page liées à RecyclerView ont une Variable item. L'objet BindingHolder comporte une méthode getBinding(). renvoyant le Prix de base : ViewDataBinding .

Kotlin

override fun onBindViewHolder(holder: BindingHolder, position: Int) {
    item: T = items.get(position)
    holder.binding.setVariable(BR.item, item);
    holder.binding.executePendingBindings();
}

Java

public void onBindViewHolder(BindingHolder holder, int position) {
    final T item = items.get(position);
    holder.getBinding().setVariable(BR.item, item);
    holder.getBinding().executePendingBindings();
}

Thread d'arrière-plan

Vous pouvez modifier votre modèle de données dans un thread d'arrière-plan tant qu'il ne s'agit pas collection. La liaison de données localise chaque variable ou champ pendant l'évaluation pour afin d'éviter tout problème de simultanéité.

Noms des classes de liaison personnalisées

Par défaut, une classe de liaison est générée en fonction du nom du fichier de mise en page, en commençant par une lettre majuscule, en supprimant les traits de soulignement ( _ ), en mettant en majuscule la la lettre suivante et en ajoutant le suffixe du mot Binding (Liaison). Par exemple, le fichier de mise en page contact_item.xml génère la classe ContactItemBinding. Le cours est placé dans un package databinding sous le package "module". Par exemple, si le module est com.example.my.app, la classe de liaison est placée dans Package com.example.my.app.databinding.

Les classes de liaison peuvent être renommées ou placées dans des packages différents en ajustant la Attribut class de l'élément data. Par exemple, la mise en page suivante génère la classe de liaison ContactItem dans le package databinding de module actuel:

<data class="ContactItem">
    ...
</data>

Vous pouvez générer la classe de liaison dans un autre package en ajoutant le préfixe de la classe par un point. L'exemple suivant génère la classe de liaison dans le "module" :

<data class=".ContactItem">
    ...
</data>

Vous pouvez également utiliser le nom complet du package pour la classe de liaison générées. L'exemple suivant crée la classe de liaison ContactItem dans le Package com.example:

<data class="com.example.ContactItem">
    ...
</data>

Ressources supplémentaires

Pour en savoir plus sur la liaison de données, consultez les ressources supplémentaires suivantes.