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