android - ejemplo - data binding in fragment kotlin
Error al usar databinding en Android (12)
Estoy intentando probar el enlace de datos como se indica en la guía here . He incluido esto en mi archivo build.gradle (de la aplicación del módulo):
compileSdkVersion ''android-MNC''
buildToolsVersion ''23.0.0 rc2''
En el archivo build.gradle del proyecto, he incluido esto en mis dependencias:
classpath "com.android.tools.build:gradle:1.3.0-beta2"
classpath "com.android.databinding:dataBinder:1.0-rc0"
El archivo de diseño es exactamente el mismo que el proporcionado en la guía.
<?xml version="1.0" encoding="utf-8"?>
<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}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
Inicialmente dio un error El Element layout does not have the required attribute layout_width and layout_height
.
Intenté solucionarlo asignando match_parent a ambos. Luego recibí el error Error parsing XML: duplicate attribute
en las líneas donde layout_height
y layout_width
al diseño lineal.
Nuevamente traté de arreglar esto eliminando estos atributos. Ahora, cada vez que intento compilar, veo esto error: package my.package.name.databinding
no existe.
La finalización del código está funcionando perfectamente en mi Fragmento donde estoy tratando de usar este diseño.
Así que ... qué me perdí ?
// Esto está bajo activity_main xml.
<data>
<variable
name="student"
type="com.example.vishalkamboj.testdatabinding.Student" />
</data>
// Esto es clase de estudiante
public class Student {
nombre de cadena pública; public String lastname;
public Student(String firstname , String lastname)
{
this.firstname = firstname;
this.lastname = lastname;
}
}
De acuerdo con la here de la guía (11/11/2015), solo tiene que agregar dos dependencias: en el archivo build.gradle del proyecto, agregue la dependencia gradle. Actualmente la version más reciente es 1.5.0-beta3
dependencies {
classpath ''com.android.tools.build:gradle:1.5.0-beta3''
}
Y en el archivo build.gradle del módulo, incluya la sección dataBinding:
android{
...
dataBinding {
enabled = true
}
...
}
El error
error: el paquete my.package.name.databinding no existe
puede ocurrir porque hay un desajuste entre el xml y la clase POJO
Debe tener mucho cuidado de que sus miembros de datos de la clase POJO sean public
si no está creando los setters getter.
Si tiene un POJO simple sin ningún captador o colocador
public class User {
public final String firstName;
public final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Si haces getter setter, clase de estilo javaBean
public class User {
private final String firstName;
private final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
}
En mi caso, el problema era que estaba agregando layout_height
y layout_width
a la etiqueta de layout
y también a mi diseño de raíz. Acabo de eliminar ambos atributos de la etiqueta de layout
y resolví el problema.
Es posible que tenga un problema o desajuste entre su modelo y su archivo de diseño. En mi caso, tuve:
...
<TextView
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/photo"
android:layout_toStartOf="@+id/photo"
tools:text="0912454433"
android:textStyle="bold"
android:text="@{contact.cellPhoneNumber}"
android:layout_below="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
pero mi clase de modelo era así:
public class MyContact {
public String name;
public String cellphoneNumber; // <-- Notice the lowercase ''p''
}
Esto parece ser un problema en el estudio de Android. El editor lo marcará como un error, sin embargo, aún se compilará.
Tuve el mismo problema y cloné este repo de ejemplo para probar que mi sistema está configurado correctamente para admitir la API de enlace de datos https://github.com/mgrzechocinski/android-bindings-example
Ignore la advertencia de error en la etiqueta de layout
. Está mal.
Algo que noté es que no requiere necesariamente la etiqueta de data
si simplemente usa el enlace de datos para obtener acceso a los elementos de vistas a través de la clase BindingActivity que se genera.
Parece que olvidó agregar el complemento de enlace de datos al archivo gradle de su aplicación:
apply plugin: ''com.android.databinding''
Debe aplicarlo a cualquier módulo que desee usar el enlace de datos.
Además, no debe agregar layout_w / h a la etiqueta de layout
, solo es un error de Android Studio, ya corregido en aosp.
Si está utilizando el complemento ''android-apt'' para daga u otras bibliotecas, después de habilitar el enlace de datos, debe eliminar el complemento ''android-apt'' y usar ''provided'' en lugar de ''apt'' en sus dependencias. Por ejemplo, si está usando daga, elimine esto
classpath ''com.neenbedankt.gradle.plugins:android-apt:1.4''
y esto
apply plugin: ''com.neenbedankt.android-apt''
y luego reemplazar
apt ''com.google.dagger:dagger-compiler:2.0''
con
provided ''com.google.dagger:dagger-compiler:2.0''
También sufro con el mismo problema. Pero mi error es
Variables de clase de usuario declaradas como no públicas. Entonces deberíamos declarar las variables de clase POJO como públicas.
public class User {
public String firstName,lastName;
public User(String fname,String lname){
this.firstName=fname;
this.lastName=lname;
}
}
Luego resolvió mi problema.
Tus enlaces en el archivo xml pueden no ser válidos.
Asegúrate de volver a verificar
- ¿Los atributos de
type
son una referencia válida para el objeto de datos?type="my.package.Class"
- ¿El enlace es válido?
name="client"
->"@{client.field}"
- ¿Son accesibles los campos de datos?
public
o encapsulado con getters - Son los nombres de los campos en java y el archivo xml que coincida, compruebe si hay errores tipográficos
- Si ha cambiado el nombre del archivo xml, asegúrese de actualizar también los objetos vinculantes.
OldNameBinding -> NewNameBinding
- Proyecto limpio
generalmente se debe a que hay un error en su archivo de diseño XML y no puede generar el objeto vinculante. Asegúrese de escribir el tipo de datos correctamente, marque la parte inferior o superior de su escritura.
<data>
<variable name="yourObject" type="com.example.simple.YourObject"/>
</data>
Y asegúrese de que el objeto tenga la llamada correcta:
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{yourObject.name}"/>
<TextView
apply plugin: ''com.neenbedankt.android-apt''
de mi build.gradle resolvió mi problema.