Clases de vinculación generadas

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.