La biblioteca de vinculación de datos genera clases de vinculación que puedes usar para acceder a la variables y vistas de tu diseño. En esta documentación, se muestra cómo crear y personalizar las clases de vinculación generadas.
La clase de vinculación generada vincula las variables de diseño con las vistas dentro del
. Puedes personalizar el nombre y el paquete de
la vinculación. Todas las clases de vinculación generadas se heredan del
ViewDataBinding
.
Se genera una clase de vinculación para cada archivo de diseño. De forma predeterminada, el nombre del
clase es el nombre del archivo de diseño convertido a mayúsculas y minúsculas con el argumento Binding
que se le agregó. Por ejemplo, si el nombre del archivo de diseño es
activity_main.xml
, la clase generada correspondiente es ActivityMainBinding
.
Esta clase contiene todas las vinculaciones, desde las propiedades del diseño hasta los
y sabe cómo asignar valores para las expresiones de vinculación.
Crea un objeto de vinculación
El objeto de vinculación se crea inmediatamente después de aumentar el diseño para que sea
asegurarte de que la jerarquía de vistas no se modifique antes de vincularse a las vistas con
en el diseño. El método más común para vincular el objeto a una
es usar los métodos estáticos en la clase de vinculación. Puedes aumentar la
jerarquía de vistas y vincula el objeto a ella usando el método inflate()
de la
Binding, como se muestra en el siguiente ejemplo:
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); }
Existe una versión alternativa del método inflate()
que toma un
ViewGroup
además de
objeto LayoutInflater
, como
como se muestra en el siguiente ejemplo:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)
Java
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);
Si el diseño aumenta con un mecanismo diferente, puedes vincularlo. por separado, de la siguiente manera:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
Java
MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);
A veces, no conoces el tipo de vinculación de antemano. En esos casos, puedes
crea la vinculación con el
clase DataBindingUtil
,
como se muestra en el siguiente fragmento de código:
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 usas elementos de vinculación de datos dentro de
Fragment
:
ListView
o
RecyclerView
adaptador, tal vez prefieras usar el
inflate()
de las clases de vinculación
DataBindingUtil
, como
como se muestra en el siguiente ejemplo de código:
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);
Vistas con ID
La biblioteca de vinculación de datos crea un campo inmutable en la clase de vinculación para
cada vista que tiene un ID en el diseño. Por ejemplo, la biblioteca de vinculación de datos
crea los campos firstName
y lastName
de tipo TextView
desde el
siguiente diseño:
<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 biblioteca extrae las vistas, incluidos los ID, de la jerarquía de vistas en un
un pase único. Este mecanismo puede ser más rápido que llamar al
findViewById()
para cada vista en el diseño.
Los IDs no son tan necesarios como sin vinculación de datos, pero aún hay algunas instancias en las que es necesario acceder a las vistas desde el código.
Variables
La biblioteca de vinculación de datos genera métodos de acceso para cada variable declarada
en el diseño. Por ejemplo, el siguiente diseño genera métodos set y get
en la clase de vinculación para las variables user
, image
y 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>
ViewStubs
A diferencia de las vistas normales, los objetos ViewStub
comiencen como vistas invisibles. Cuando se hacen visibles o se aumentan de forma explícita,
se reemplazan en el diseño aumentando otro diseño.
Como ViewStub
desaparece de la jerarquía de vistas, la vista de la
El objeto de vinculación también debe desaparecer para permitir que lo reclame la recolección de elementos no utilizados.
Como las vistas son definitivas, un
Objeto ViewStubProxy
toma el lugar de ViewStub
en la clase de vinculación generada, lo que te brinda
acceso a ViewStub
cuando existe y acceso a la vista aumentada
la jerarquía cuando se aumenta ViewStub
.
Cuando se aumenta otro diseño, se debe establecer una vinculación para el diseño nuevo.
Por lo tanto, ViewStubProxy
debe escuchar a ViewStub
.
OnInflateListener
y establecer la vinculación cuando sea necesario. Como solo puede existir un objeto de escucha en un
momento, ViewStubProxy
te permite configurar un OnInflateListener
, al que llama
después de establecer la vinculación.
Vinculación inmediata
Cuando cambia una variable o un objeto observable, la vinculación está programada para cambiar
antes del siguiente fotograma. Sin embargo, hay momentos en que la vinculación debe ejecutarse
de inmediato. Para forzar la ejecución, usa la
executePendingBindings()
.
Variables dinámicas
A veces, se desconoce la clase de vinculación específica. Por ejemplo, un
RecyclerView.Adapter
que opera con diseños arbitrarios no conoce la clase de vinculación específica. Integra
debe asignar el valor de vinculación durante la llamada a la
onBindViewHolder()
.
En el siguiente ejemplo, todos los diseños que RecyclerView
vincula para tener un
Variable item
. El objeto BindingHolder
tiene un método getBinding()
para devolver el
Base de 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(); }
Subproceso en segundo plano
Puedes cambiar tu modelo de datos en un subproceso en segundo plano, siempre y cuando no sea una de elementos no utilizados. La vinculación de datos localiza cada variable o campo durante la evaluación a evitar problemas de simultaneidad.
Nombres de clases de vinculación personalizadas
De forma predeterminada, se genera una clase de vinculación basada en el nombre del archivo de diseño.
Comienza con una letra mayúscula, quita los guiones bajos ( _ ) y usa mayúscula
siguiente letra y el sufijo de la palabra Binding. Por ejemplo, el archivo de diseño
contact_item.xml
genera la clase ContactItemBinding
. Se coloca la clase
en un paquete databinding
en el paquete del módulo. Por ejemplo, si el módulo
paquete es com.example.my.app
, la clase de vinculación se coloca en el
Paquete com.example.my.app.databinding
.
Las clases Binding se pueden renombrar o colocar en diferentes paquetes ajustando el
Atributo class
del elemento data
. Por ejemplo, el siguiente diseño
Genera la clase de vinculación ContactItem
en el paquete databinding
del
módulo actual:
<data class="ContactItem">
...
</data>
Puedes generar la clase de vinculación en un paquete diferente agregando un prefijo a la clase. nombre con un punto. El siguiente ejemplo genera la clase de vinculación en la Paquete de módulos:
<data class=".ContactItem">
...
</data>
También puedes usar el nombre completo del paquete donde quieres que esté la clase de vinculación
de red. En el siguiente ejemplo, se crea la clase de vinculación ContactItem
en la
Paquete com.example
:
<data class="com.example.ContactItem">
...
</data>
Recursos adicionales
Para obtener más información sobre la vinculación de datos, consulta los siguientes recursos adicionales.
- Ejemplos de la biblioteca de vinculación de datos de Android
- Vinculación de datos en Android
- Vinculación de datos: lecciones aprendidas
Recomendaciones para ti
- Nota: El texto del vínculo se muestra cuando JavaScript está desactivado
- Diseños y expresiones vinculantes
- Biblioteca de vinculación de datos
- Vinculación de vistas