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.
- Exemples de la bibliothèque de liaison de données Android
- Liaison de données sous Android
- Liaison de données : enseignements
Recommandations personnalisées
- Remarque : Le texte du lien s'affiche lorsque JavaScript est désactivé
- Dispositions et expressions de liaison
- Bibliothèque Data Binding
- Liaison de vue